我想阅读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++0x与g++-4.6.3
这个问题更多的是解析消歧而不是阅读文件.
这就是为什么人们应该使用花括号进行初始化:
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)
希望有所帮助.