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
相关产品推荐
相关产品推荐

