使用string和istream_iterator的C ++编译错误

时间:2009-11-05 22:03:43

标签: c++ string iterator istream-iterator

尝试编译以下内容时:

#include <string>
#include <iterator>
#include <iostream>
using namespace std;
int main() {
  string s(istream_iterator<char>(cin), istream_iterator<char>());
  return s.size();
}

g ++ 4.4.1给了我:

main.cc: In function ‘int main()’:
main.cc:6: error: request for member ‘size’ in ‘s’, which is of non-class type ‘std::string(std::istream_iterator<char, char, std::char_traits<char>, int>, std::istream_iterator<char, char, std::char_traits<char>, int> (*)())’

根据libstdc++ docs,string有一个ctor,它接受一个开始/结束迭代器对。那么为什么我会收到这个错误呢?

3 个答案:

答案 0 :(得分:5)

您不小心声明了一个函数而不是实例化一个字符串。尝试为istream_iterator对象声明变量,然后将它们传递给std :: string构造函数。

这是一篇很好的解读,准确描述了您的问题:http://www.gotw.ca/gotw/075.htm

答案 1 :(得分:3)

搜索“最令人烦恼的解析”,你会找到比你想知道更多的东西。

底线是编译器将您的两个参数解释为指定类型而不是值。反过来,这导致它将您的定义解释为函数的声明。

答案 2 :(得分:3)

你已经声明了一个函数而不是变量。写下以修复:

string s(istream_iterator<char>(cin), (istream_iterator<char>()));