error #2153: expression must have class type(低级错误:看是指针还是对象->和.的使用要正确)

本文解决了一个关于C++中使用指针调用成员函数时出现的编译错误。具体问题是在尝试查找map中对应服务费用标志时,由于错误地使用了指针而非对象来调用成员函数GetServID()导致编译失败。文中提供了错误代码及修正后的正确写法。


        _it= gServMan.mapCFeeFlag.find(serv->GetServID());   serv是个指针,而我写成了serv.


"xxx.cpp", line 1342: error #2153: expression must have class type
                                                 _it= gServMan.mapCFeeFlag.find(serv.GetServID());
                                                                                ^

在C语言编程中,编译错误 `error #154: expression must have struct or union type` 表示程序中某处使用了结构体或联合体的成员访问操作符(`.` 或 `->`),但所操作的对象并不是结构体或联合体类型。这种错误通常出现在以下几种情况: 1. **访问了非结构体/联合体变量的成员** 如果尝试使用 `.` 或 `->` 访问一个非结构体或联合体类型的变量的“成员”,编译器会报此错误。例如: ```c int a; a.value = 10; // error #154: expression must have struct or union type ``` 2. **指针类型错误或未正确解引用** 当使用 `->` 操作符时,操作对象必须是指向结构体或联合体的指针。如果指针类型不正确或未正确解引用,也可能引发此错误。 3. **宏定义或类型定义错误** 如果结构体类型定义不正确,或者使用宏定义掩盖了结构体定义,可能导致编译器无法识别结构体成员。 4. **函数返回值类型错误** 如果某个函数返回的是基本类型,但在调用时误以为其返回结构体类型,也可能会导致此类错误。例如: ```c struct MyStruct getStruct() { struct MyStruct s; return s; } int main() { int value = getStruct().field; // 正确 value = getStruct()->field; // error #154: expression must have struct or union type return 0; } ``` 5. **编译器版本或标准差异** 在某些编译器(如IAR Embedded Workbench)中,对C语言标准的支持可能存在差异,尤其是在使用较老的C标准(如C89)时,结构体初始化访问方式可能受到限制。 ### 解决方法 - 检查使用 `.` 或 `->` 的表达式,确保操作对象是结构体或联合体类型。 - 如果使用指针,确认指针类型正确,并且确实指向结构体或联合体。 - 检查结构体定义是否完整,确保在使用前已正确声明。 - 如果使用了复杂的宏定义或类型别名,建议展开宏或使用 `typedef` 明确结构体类型。 - 确保函数返回值类型与调用方式匹配,避免将返回的结构体当作指针使用。 以 `AD7606.c` 文件第 145 行为例,建议检查该行附近的代码,确认是否对非结构体变量使用了成员访问操作符,或者是否误用了指针与结构体之间的访问方式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值