编译代码我收到了以下错误
代码:
#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;}
错误:
/root/newtest/main.cpp|4|error: field ‘int a::a’ with same name as class [-fpermissive]|
/root/newtest/main.cpp|9|error: field ‘int b::b’ with same name as class [-fpermissive]|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
为什么我会收到这些错误?
我刚刚在class a
和class b
中定义了构造函数。
答案 0 :(得分:3)
您的成员变量和您的构造函数发生冲突。 C ++标准不允许:
此外,如果类T具有用户声明的构造函数,则每个 T类的非静态数据成员的名称应与T不同。
Removing the constructor,或重命名变量将使其构建得很好。 class a
的成员可以被命名为a
和it will hide the injected class name。但是我希望你看到一旦你需要开始添加构造函数会有什么问题,因为在一个类外定义中a::a
指的是什么?根本不用解析。
答案 1 :(得分:1)
成员变量int a
的名称与 inject-class-name 的冲突也是a
。
12个班级[class]
在看到类名后立即将类名插入到作用域中。类名也插入到类本身的范围内;这被称为注入类名。出于访问检查的目的,inject-class-name被视为公共成员名称。
6.4名称查找[basic.lookup]
为了名称隐藏和查找,类的注入类名(第12条)也被视为该类的成员。< / p>
作为选项,您可以为成员变量a
和b
使用不同的名称。