【问题标题】:C++ compilation error using string and istream_iterator使用字符串和 istream_iterator 的 C++ 编译错误
【发布时间】:2009-11-05 22:03:43
【问题描述】:

尝试编译以下内容时:

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

【问题讨论】:

    标签: c++ string iterator istream-iterator


    【解决方案1】:

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

    这里有一篇很好的文章,准确地描述了你的问题:http://www.gotw.ca/gotw/075.htm

    【讨论】:

    • 或者:字符串 s = string(istream_iterator(cin), istream_iterator());
    • 我也更喜欢 Nate Kohl 的方法,它的成本并不高(就打字而言),而且副本可能已经被优化掉了。
    • @Mattieu M.,如果您查看 Herb Sutter 的声明,我认为它实际上减少了输入,因为您不必重复“istream_iterator”样板。这些变量可能也被优化掉了,Herb 更喜欢它,“因为它更容易正确,即使是最弱的编译器也完全可以理解,而且它使代码更清晰易读。”
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-10
        • 1970-01-01
        • 1970-01-01
        • 2016-10-13
        • 1970-01-01
        • 1970-01-01
        • 2013-11-03
        相关资源
        最近更新 更多