【问题标题】:Passing fstream reference as function parameter in C++11在 C++11 中将 fstream 引用作为函数参数传递
【发布时间】:2013-01-24 20:39:30
【问题描述】:

我今天刚刚遇到一个问题:以下代码似乎在 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 或其他任何东西有关。

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

【问题讨论】:

  • 代码正确。 Check it here 为自己使用 clang++ 3.2。
  • 您是否缺少#include &lt;fstream&gt;?如果没有,请发布完整的SSCCE
  • 您可以#include &lt;iosfwd&gt; 允许您使用指针和引用,但不能真正使用对象。此外,对于流,请改为传递基类。另一个问题:这是否打算作为要写入的流?如果是,则使用std::ostream&amp; out 作为参数。如果它也应该被阅读,那么使用std::iostream&amp; stream。仅当您需要特定于文件流的内容时,才使用代码中的表单。
  • @ildjarn 是的,我包含了 并相应地编辑了源代码。
  • @doomster 哦,你是对的。 'std::ostream& out' 在那里编译得非常完美。我仍然不明白为什么,但确实如此。如果您将评论移至答案中,我会接受。

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


【解决方案1】:

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

#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 &lt;iosfwd&gt; 而不是#include &lt;fstream&gt;。如果你解决了这个问题,一切都会好起来的。

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

【讨论】:

    猜你喜欢
    • 2016-04-21
    • 2014-02-25
    • 1970-01-01
    • 2018-01-20
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多