1

尝试编译以下内容时:

#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++ 文档,字符串有一个接受开始/结束迭代器对的 ctor。那为什么会出现这个错误呢?

4

3 回答 3

5

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

这是一个很好的阅读,准确地描述了你的问题:http ://www.gotw.ca/gotw/075.htm

于 2009-11-05T22:06:25.737 回答
3

搜索“最令人头疼的解析”,你会发现比你想知道的更多。

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

于 2009-11-05T22:07:09.667 回答
3

您已经声明了一个函数而不是变量。编写以下内容进行修复:

string s(istream_iterator<char>(cin), (istream_iterator<char>()));
于 2009-11-05T22:09:01.210 回答