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

GCC编译器报‘void value not ignored as it ought to be’错误求助

解决GCC错误:"void value not ignored as it ought to be"

这个错误的根源其实是运算符优先级在搞鬼,咱们一步步拆解问题:

错误原因分析

你代码里的这两行:

*enemya -> attack();
*enemyb -> attack();

C++里,->(指针成员访问运算符)的优先级比*(解引用运算符)高,所以编译器会把它解析成:

*(enemya->attack());
*(enemyb->attack());

但你的attack()函数是void返回类型——它没有返回值,你却试图对一个void值做解引用操作,这就违反了语法规则,触发了GCC的这个错误提示。

两种修正方案

方案1:直接用指针调用(推荐)

既然enemya和enemyb本身就是指向对象的指针,直接用->调用成员函数就可以,完全不需要额外的解引用:

enemya->attack();
enemyb->attack();

方案2:显式解引用(加括号修正优先级)

如果你非要用解引用的方式调用,记得给*enemya加上括号,确保编译器先解引用指针得到对象,再用.调用成员函数:

(*enemya).attack();
(*enemyb).attack();

修正后的完整代码

#include<iostream>
using namespace std;
class enemy {
public:
    virtual void attack() {
        cout<<"Yo!!! i am the ENEMY "<<endl;
    }
};
class ninja: public enemy {
public:
    void attack() {
        cout<<"I am the ninja"<<endl;
    }
};
class monster: public enemy {
public:
    void attack() {
        cout<<"And, I am the monster"<<endl;
    }
};
int main() {
    ninja n;
    monster m;
    enemy *enemya = &n;
    enemy *enemyb = &m;
    // 修正后的调用方式(推荐)
    enemya->attack();
    enemyb->attack();
    // 或者用另一种写法:
    // (*enemya).attack();
    // (*enemyb).attack();
}

额外提示

虚函数的调用在这里是正常工作的,修正运算符优先级的问题后,程序会正确调用ninja和monster各自的attack()方法,实现多态效果。

内容的提问来源于stack exchange,提问作者RIFAT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:33:23