默认构造函数被误解为函数名称

3
当我编译以下代码时:
#include<iostream>
using namespace std;
class Room
{
    int length;
    int width;
public:
    void display()
    {
        cout << length << ' ' << width;
    }
    Room()
    {
        length = 0;
        width = 0;
    }
    Room(int value = 8) : length(value), width(value)
    {}
};
int main()
{
    Room objRoom1;
    objRoom1.display();
}

我遇到了以下错误:

调用“Room()”的重载版本不明确

我尝试将 Room ObjRoom1; 更改为 Room ObjRoom1(); 以解决问题,但是这样做后我得到了以下错误:

请求非类类型‘Room()’的‘display’成员在‘objRoom1’中

这是因为编译器认为 Room ObjRoom1() 是一个名为 ObjRoom1() 的函数声明,并且返回类型为 Room。你可以帮我精确定位并修复这段代码吗?


1
你知道吗?你的类默认是私有的。 - Vucko
1
如果您没有提供参数,应该调用哪一个?没有参数的那个还是带有默认参数的那个?该函数的另一个问题在C++中被称为“最令人烦恼的解析”。 - Ulrich Eckhardt
3
@UlrichEckhardt,正式的说法是“最让人恼火的解析”适用于另一种语法。 - SergeyA
1
@Vucko 那个评论有什么相关性? - πάντα ῥεῖ
1
@UlrichEckhardt,因为它的使用被保留用于类似 A a(A()); 这样的情况,而不是简单的 A a();。从第一眼就可以看出后者是函数声明。在前者中很难看出函数声明。顺便说一下,维基百科也认同这一点:https://en.wikipedia.org/wiki/Most_vexing_parse - SergeyA
显示剩余9条评论
2个回答

11

Room(int value=8)设置了默认值为8value参数。这意味着您可以在不指定值的情况下调用它,因此您可以像下面这样调用它:

Room foo;

Room()不带参数。这意味着您可以像这样调用它

Room foo;

当你使用Room foo;时,编译器应该如何知道你想使用Room(int value=8)还是Room()?由于无法确定,因此你会收到错误提示。


8

你有两个构造函数版本 - 一个不带参数,另一个带有一个默认参数。根据定义,两者都是默认构造函数,编译器无法确定你试图调用哪个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接