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++0x
和g++-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
);
希望能有所帮助。
相关文章:
- 如何使用Luacneneneba API正确读取字符串和表参数
- 如何从二进制文件中读取字符串
- 如何在 c++ 中使用 getline 从文件中读取字符串?
- 读取字符串文本输入以创建 2D 矢量
- 罗马数字到阿拉伯语 (vinculum) - 读取字符串中的字符
- C++:从文件中读取字符串和整数,并获得最大数字
- C++,从文件中读取字符串,分段错误
- 如果语句错误地读取字符串,则始终在第一个条件返回
- 如何从内存中读取字符串?
- 如何创建一个C++程序来读取字符串数组中的信息,然后将其排序到类中?
- 我需要C++读取字符串数组中每个单词的第一个字母
- 读取字符串C++的字符时出错
- 读取字符串直到标志 (C++)
- 读取字符串字符时出错 - 对于数组中的字符串值
- C++输入文件流无法从文件中读取字符串
- 读取字符串字符时出错
- 如何读取<字符串,矢量<对<int,字符串的映射>>>
- 如何使此函数使用 getline 读取字符串并使用 int 执行相同的行为?
- C++ 使用 Strtok 读取字符串字符时出错
- 使用 getline 读取字符串,但每行中都有换行符