C++创建对象时出现“Expression must have class type...”错误原因咨询
问题解析:
Calculator obj()引发的类型错误 核心原因:C++的"最令人头疼的解析"
你遇到的错误是C++语法里经典的函数声明与对象构造歧义(俗称"最令人头疼的解析"):
Calculator obj();不会被编译器解析为调用默认构造函数创建对象,而是被解析成一个名为obj的函数声明:函数返回Calculator类型,且没有参数。这就是错误提示里"type Calculator(*)()"的由来——它表示一个无参、返回Calculator的函数指针类型。- 而
Calculator obj;才是正确的默认构造对象的写法,编译器会正常调用你定义的默认构造函数(进而委托给Calculator(0,0))。
为什么会这样?
C++的语法规则规定:当一条语句既可以被解析为对象定义,又可以被解析为函数声明时,编译器会优先按照函数声明处理。Calculator obj();完全符合函数声明的语法结构(返回类型 + 函数名 + 参数列表),所以编译器会这么解读。
解决方法
如果你想明确调用默认构造函数创建对象,除了Calculator obj;,C++11及以后还可以用列表初始化语法:
Calculator obj{};
这种写法不会产生歧义,编译器会明确将其解析为对象构造。
补充说明
你的Calculator类委托构造函数的写法是完全正确的,问题仅出在对象创建的语法歧义上,和委托构造本身无关。
内容的提问来源于stack exchange,提问作者Mole_Boy
相关产品推荐
相关产品推荐

