c++ - 请求 Y 的非类类型 Z 的成员 X

标签 c++

当尝试编译以下 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>)’

我知道这个错误通常是由于不小心使用无参数运算符声明函数引起的,如

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;
}

最佳答案

正确,

vector<int> words(istream_iterator<int>(i), istream_iterator<int> );

这是一个名为 words 的函数,取两个 istream_iterator<int>参数,其中一个名为 i,另一个没有名称,返回 vector 。更改为:

vector<int> words((istream_iterator<int>(i)), istream_iterator<int>() );

第一个括号添加(istream_iterator<int>(i))使它成为一个表达式,这样就不会出现歧义。其他括号istream_iterator<int>()是强制性的,因为您构造一个临时的。一个类型本身,比如 istream_iterator<int> , 不构造一个临时的。

关于c++ - 请求 Y 的非类类型 Z 的成员 X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4648948/

相关文章:

c++ - 参数类型模板类型中的通用 lambda auto

c++ - 使用大局部变量优化频繁调用的函数 (C++)

c++ 类及其布局和转换

android - 仅在Android上查询时出现SQL逻辑错误

c++ - 使与 IPv6 或 IPv4 的连接变得容易?

C++ float 存储

c++ - uniform_int_distribution 在这里用错了吗? (我的结果似乎分布不均)

c++ - 如何在C++中读取然后编辑文件txt

c++ - 多维括号括起的初始化列表到多 vector

c++ - 快板 5 不工作