我想读一个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/