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

g++ 4.6.3 reading contents of a file into string parsing ambiguity

我想阅读一个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++0xg++-4.6.3

编译

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

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

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

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


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

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

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

  • 函数名称是 buf 其中 returnsstd::vector<char>.
  • 它接受两个类型的参数:
    • std::istreambuf_iterator<char>(stream),这只是 std::istreambuf_iterator<char> stream 的另一种写法(括号在这种情况下是多余的)。
    • std::istreambuf_iterator<char>() 又是一个函数类型 (在这种情况下,parens 不是 多余的) — 衰减为函数指针类型,指向一个函数:
      • 什么都不用 return 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
);

希望对您有所帮助。