在C ++ 11中将fstream引用作为函数参数传递

时间:2013-01-24 20:39:30

标签: c++ c++11 clang fstream

我今天刚遇到一个问题:以下代码似乎在MSVC ++ 2010中有效,但在Clang LLVM 4.1(使用GNU ++ 11)时无效。

#include <fstream>

void foo(std::fstream& file){
    file << "foo";
}
int main() {
   std::fstream dummy("dummy");
   foo(dummy);
   return 0;
}

产生

Invalid operands to binary expression (std::fstream (aka basic_fstream<char>) and const char[4])

在Clang上。我认为通过引用传递iostream参数在C ++中是常见的做法。我甚至不确定这是否与clang,C ++ 11或其他任何内容有关。

我知道如何将流传递给函数吗?

1 个答案:

答案 0 :(得分:3)

我认为您的原始代码(您在原始问题中仅部分发布)看起来像这样:

#include <iosfwd>

void foo(std::fstream& file){
    file << "foo";
}

int main() {
   std::fstream dummy("dummy");
   foo(dummy);
   return 0;
}

实际上,这给出了clang ++ 3.2

的以下错误消息
Compilation finished with errors:
source.cpp:4:10: error: invalid operands to binary expression ('std::fstream' (aka 'basic_fstream<char>') and 'const char [4]')
file << "foo";
~~~~ ^ ~~~~~
source.cpp:8:17: error: implicit instantiation of undefined template 'std::basic_fstream<char, std::char_traits<char> >'
std::fstream dummy("dummy");
^
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/iosfwd:118:11: note: template is declared here
class basic_fstream;
^
2 errors generated.

不幸的是,您只发布了第一条错误消息,但没有发布第二条错误消息。

从第二条错误消息中,很明显您只有#include <iosfwd>而不是#include <fstream>。如果你解决了这个问题,一切都会好的。

请在下次发布完整代码和所有错误消息。