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

igg*_*ggy 5 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>());
Run Code Online (Sandbox Code Playgroud)

但是当我说:

if(buf.size())
...
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

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> > (*)())'
Run Code Online (Sandbox Code Playgroud)

所以编译器认为我声明了一个函数而不是一个函数vector<char>.我怎样才能使它工作?

我编译-std=c++0xg++-4.6.3

这个问题更多的是解析消歧而不是阅读文件.

Naw*_*waz 5

这就是为什么人们应该使用花括号进行初始化:

std::vector<char> buf { 
                        std::istreambuf_iterator<char>(stream),
                        std::istreambuf_iterator<char>() 
                       };
Run Code Online (Sandbox Code Playgroud)

对你来说,buf不是一个对象-这是相当一个函数声明.在c ++中搜索vexing parse以了解它为什么是函数声明的解释.这里有相当多的主题.


好的.以下是您的代码所发生的情况.这段代码:

 std::vector<char> buf(std::istreambuf_iterator<char>(stream),
                      std::istreambuf_iterator<char>());
Run Code Online (Sandbox Code Playgroud)

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

  • 函数名称buf返回std::vector<char>.
  • 它需要两个类型的参数:
    • std::istreambuf_iterator<char>(stream),这只是另一种写作方式std::istreambuf_iterator<char> stream(在这种情况下,parens是多余的).
    • std::istreambuf_iterator<char>()这是一种功能型再次(括号是在此情况下多余) - ,其衰减到一个函数指针类型,指向一个函数:
      • 什么都不带回来 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
);
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • @iggy,这不可能是一个函数声明.另一个可以. (2认同)