C++编译错误解析请求:类与成员同名导致的报错问题
解析C++编译错误:成员变量与类同名的问题
这个编译错误的根源很直接——你在类a里定义了一个和类名完全相同的成员变量int a=5;,这在C++里是不被允许的。
先看你给出的报错代码:
#include <iostream> using namespace std; class a { protected: int a=5; // 这里就是问题核心 public: a(){cout<<"a c"<<endl;} }; class b { protected: int b=6; public: b(){cout<<"b c"<<endl;} }; class d :protected a,protected b { public: void display() {cout<<a<<b<<endl;} d(){cout<<"d c"<<endl;} }; int main() {d m; m.display();return 0;}
错误原因
编译器抛出的error: field ‘int a::a’ with same name ...已经说得很明白:类a的成员变量和类本身同名了,这会造成命名歧义。编译器无法判断你在代码中写的a到底是指代这个类类型,还是类内部的那个成员变量,所以直接拒绝编译。
修复方案
只需要把类a里的成员变量名字改成和类名不重复的标识符即可,比如改成val_a,同时同步修改d类中引用这个变量的地方:
修改后的完整代码:
#include <iostream> using namespace std; class a { protected: int val_a=5; // 重命名成员变量,避免和类名冲突 public: a(){cout<<"a c"<<endl;} }; class b { protected: int b=6; public: b(){cout<<"b c"<<endl;} }; class d :protected a,protected b { public: void display() {cout<<val_a<<b<<endl;} // 同步修改变量名 d(){cout<<"d c"<<endl;} }; int main() {d m; m.display();return 0;}
这样编译就能正常通过,运行后会输出:
a c b c d c 56
内容的提问来源于stack exchange,提问作者samir imtiaz
相关产品推荐
相关产品推荐

