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++ 中搜索 vexing parse 以了解为什么它是一个函数的解释 declaration.There 几乎有数百个主题。
好的。这是您的代码会发生什么。此代码:
std::vector<char> buf(std::istreambuf_iterator<char>(stream),
std::istreambuf_iterator<char>());
被编译器视为函数声明,其中:
- 函数名称是
buf
其中 returnsstd::vector<char>
.
- 它接受两个类型的参数:
std::istreambuf_iterator<char>(stream)
,这只是 std::istreambuf_iterator<char> stream
的另一种写法(括号在这种情况下是多余的)。
std::istreambuf_iterator<char>()
又是一个函数类型 (在这种情况下,parens 不是 多余的) — 衰减为函数指针类型,指向一个函数:
- 什么都不用 return
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
);
希望对您有所帮助。
我想阅读一个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++ 中搜索 vexing parse 以了解为什么它是一个函数的解释 declaration.There 几乎有数百个主题。
好的。这是您的代码会发生什么。此代码:
std::vector<char> buf(std::istreambuf_iterator<char>(stream),
std::istreambuf_iterator<char>());
被编译器视为函数声明,其中:
- 函数名称是
buf
其中 returnsstd::vector<char>
. - 它接受两个类型的参数:
std::istreambuf_iterator<char>(stream)
,这只是std::istreambuf_iterator<char> stream
的另一种写法(括号在这种情况下是多余的)。std::istreambuf_iterator<char>()
又是一个函数类型 (在这种情况下,parens 不是 多余的) — 衰减为函数指针类型,指向一个函数:- 什么都不用 return
std::istreambuf_iterator<char>
- 什么都不用 return
所以你的代码变成这样:
std::vector<char> //return-type
buf //function-name
(
std::istreambuf_iterator<char> stream, //1st (named) parameter
std::istreambuf_iterator<char> (*)() //2nd (unnamed) parameter
);
希望对您有所帮助。