c++ - g++ 4.6.3 将文件内容读入字符串解析歧义

标签 c++ g++

我想读一个ifstream的内容

#include <vector>
#include <iterator>
#include <fstream>

std::ifstream stream;
std::vector<char> buf(std::istreambuf_iterator<char>(stream),
    std::istreambuf_iterator<char>());

但是当我说:

if(buf.size())
...

我得到一个错误

error: request for member 'size' in 'buf', which is of non-class type 'std::vector<char, std::istreambuf_iterator<char, std::char_traits<char> > >(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> > (*)())'

因此编译器认为我正在声明一个函数而不是 vector<char> .我怎样才能让它发挥作用?

我用 -std=c++0x 编译与 g++-4.6.3

这个问题更多的是关于解析消歧而不是读取文件。

最佳答案

这就是为什么应该使用大括号进行初始化的原因:

std::vector<char> buf { 
                        std::istreambuf_iterator<char>(stream),
                        std::istreambuf_iterator<char>() 
                       };

在你的例子中,buf 不是一个对象——它更像是一个函数声明。搜索 vexing parse in c++ 以了解为什么它是函数声明的解释。关于此的主题几乎有数百个。


好的。这是您的代码会发生什么。这段代码:

 std::vector<char> buf(std::istreambuf_iterator<char>(stream),
                      std::istreambuf_iterator<char>());

被编译器视为函数声明,其中:

  • 函数名称是buf返回 std::vector<char> .
  • 它接受两个类型的参数:
    • std::istreambuf_iterator<char>(stream) ,这只是另一种写法 std::istreambuf_iterator<char> stream (在这种情况下 parent 是多余的)。
    • std::istreambuf_iterator<char>()这是一个函数类型再次(parens在这种情况下不是是多余的)——它退化为一个函数指针类型,指向一个函数:
      • 什么也不做,返回std::istreambuf_iterator<char>

所以你的代码变成这样:

std::vector<char>                         //return-type
buf                                       //function-name
(
  std::istreambuf_iterator<char> stream,  //1st (named) parameter
  std::istreambuf_iterator<char> (*)()    //2nd (unnamed) parameter
);

希望对您有所帮助。

关于c++ - g++ 4.6.3 将文件内容读入字符串解析歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29847722/

相关文章:

c++ - 用于构建链表的宏

c++ - 默认构造函数未被调用 C++ OOP

node.js - 如何使用调试符号制作node-waf构建二进制文件?

c++ - 键盘布局方向

c++ - 完全特化的模板功能

c++ - 为什么此分配器不适用于 `std::allocate_shared` ?奇怪的模板替换错误

C++ 外部对象数组

c++ - g++ -O2 错误地优化了 SIMD 变量赋值

c++ - 我有这两个相似的类(class)。您将使用什么设计来分解代码?

c++ - Windows GTest EXPECT_STREQ : error: no matching function for call to 'CmpHelperSTREQ'