尝试编译以下C ++代码片段时(以下完整源代码)
A::A(istream& i) {
vector<string> words( istream_iterator<int>(i), istream_iterator<int> );
words.begin();
}
我收到了错误
istream_it.cpp:12: error: request for member ‘begin’ in ‘words’, which is of non-class type
‘std::vector<int, std::allocator<int> >(
std::istream_iterator<int, char, std::char_traits<char>, long int>,
std::istream_iterator<int, char, std::char_traits<char>, long int>)’
我知道这个错误通常是由使用no-parameters运算符意外声明一个函数引起的,如
string s(); s.size();
但在这种情况下,我已经删除了所有不必要的代码,但仍然无法确定究竟出现了什么问题,或者正确的语法是什么。
完整来源:
#include <sstream>
#include <vector>
#include <iterator>
#include <string>
using namespace std;
class A {
public:
A(istream& i) {
vector<int> words(istream_iterator<int>(i), istream_iterator<int> );
words.begin();
}
};
int main(int argc, char** argv)
{
istringstream iss("1 2 3");
A a(iss);
return 0;
}
答案 0 :(得分:7)
正确,
vector<int> words(istream_iterator<int>(i), istream_iterator<int> );
这是一个名为words的函数,它带有两个istream_iterator<int>
参数,其中一个名为i,另一个没有名称,并返回向量。改为:
vector<int> words((istream_iterator<int>(i)), istream_iterator<int>() );
添加(istream_iterator<int>(i))
的第一个括号使其成为表达式,因此不存在歧义。其他括号istream_iterator<int>()
是必需的,因为构造是临时的。像istream_iterator<int>
这样的类型本身并不构造临时类型。