"ofstream" 作为函数参数

40

有没有一种方法可以像这样将输出流作为参数传递:

void foo (std::ofstream dumFile) {}

我尝试了一下,但出现了以下错误:

error : class "std::basic_ofstream<char, std::char_traits<char>>"没有合适的复制构造函数

3个回答

55

当然可以,只需要使用引用。 像这样:

void foo (std::ofstream& dumFile) {}
否则将会调用拷贝构造函数,但该类 ofstream 并未定义该函数。

2
只是一个提示:一旦构建完成,通常无论您得到了什么类型的流,都不重要,并且使用std::ostream&更可取(请注意没有f)。 - Dietmar Kühl
甚至更加通用:template<typename Char, typename Traits> … std::basic_ostream<Char, Traits>& - Philipp
如果我使用 void foo (const std::ofstream& dumFile),它会做什么?它会向 dumFile 写入内容并且无法更改其地址,还是它不能写入其中? - thedarkside ofthemoon

14

你必须传递一个 ostream 对象的引用,因为它没有复制构造函数:

void foo (std::ostream& dumFile) {}

10
如果您正在使用符合C++11标准的编译器和标准库,那么使用它应该是可以的。
void foo(std::ofstream dumFile) {}

只要使用rvalue调用即可,这样的调用看起来像foo(std::ofstream("dummy.txt"))foo(std::move(someFileStream))。否则,请将参数更改为通过引用传递,并避免需要复制/移动参数。
void foo(std::ofstream& dumFile) {}

2
鉴于std::ofstream具有移动构造函数,因此可以将临时对象传递给声明为void foo(std::ofstream)的函数,例如使用foo(std::ofstream("file"))。请注意,尽管clang的标准库已经实现了这个构造函数(即上面的代码可以在clang中编译),但gcc的标准库尚未实现(即上述代码无法在gcc中编译;gcc是错误的)。 - Dietmar Kühl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接