You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 02:54:56