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

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

本文关键字:读取 字符串 歧义 文件 g++4      更新时间:2023-10-16

我想阅读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++中搜索烦恼解析,以了解为什么它是函数声明的解释。这方面的话题有上百个。


好的。以下是您的代码发生的情况。此代码:

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的另一种书写方式(在这种情况下,parens是多余的)
    • 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
);

希望能有所帮助。