0

我今天刚刚遇到一个问题:以下代码似乎在 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])

在铿锵。我认为通过引用传递 iostream 参数将是 C++ 中的常见做法。我什至不确定这是否与 clang、C++11 或其他任何东西有关。

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

4

1 回答 1

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>. 如果你解决了这个问题,一切都会好起来的。

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

于 2013-01-25T09:24:45.377 回答