请求成员函数时出现c++错误

c++ error when requesting member function

本文关键字:c++ 错误 成员 函数 请求      更新时间:2023-10-16

我有一个这样的类

class action {
    int val;
    // some other members
public:
    action()        : val(0)   { } // default constructor initializes action type to 0
    action(int val) : val(val) { } 
    // some other member functions
    int getVal() { return val; }
};

和在简单场景中使用

action obj1(), obj2(2);
cout << "Initial state : { " << obj1.getVal() << ", " << obj2.getVal() << " }n";

得到一个编译错误

error: request for member ‘getVal’ in ‘obj1’

这是怎么回事?

这是因为不是声明action类型的obj1

action obj1()

声明了一个函数obj1,它不接受任何参数,并返回一个动作对象。首选c++11大括号初始化来调用默认构造函数

action obj1{}

或者不要使用那些额外的括号

你可以谷歌这个问题,作为c++最令人烦恼的解析

这是因为

action obj1();

实际上声明obj1是一个返回action对象的函数。除非需要向构造函数传递参数,否则请去掉括号:

action obj1;

obj1代替obj1()

要修复上述错误,在声明时删除obj1中的()。

在此语句中

action obj1(), obj2(2);

你声明的函数

action obj1()

返回类型为action,没有参数,并且有一个action类型的对象

action obj2(2);

将语句改为

action obj1, obj2(2);
另一种避免这种错误的方法是写
action obj1 {}, obj2(2);

如果你的编译器支持列表初始化。

问题在于函数声明和带有空参数列表的对象定义之间存在歧义。c++为函数声明的利益解决了冲突。