代码之家  ›  专栏  ›  技术社区  ›  xyzzyrz

用String和ISTrimaMyter实现C++编译错误

  •  1
  • xyzzyrz  · 技术社区  · 16 年前

    尝试编译以下内容时:

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

    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有一个接受开始/结束迭代器对的构造函数。那么,我为什么会犯这个错误呢?

    3 回复  |  直到 16 年前
        1
  •  5
  •   Fred Larson    16 年前

    您无意中声明了一个函数,而不是实例化了一个字符串。尝试为istream_迭代器对象声明变量,然后将这些变量传递给std::string构造函数。

    http://www.gotw.ca/gotw/075.htm

        2
  •  3
  •   Jerry Coffin    16 年前

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

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

        3
  •  3
  •   Kirill V. Lyadvinsky    16 年前

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

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