需要帮助来理解错误消息

时间:2018-03-28 05:14:12

标签: c++ constructor tree hierarchical

编译代码我收到了以下错误

代码:

#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 aclass b中定义了构造函数。

2 个答案:

答案 0 :(得分:3)

您的成员变量和您的构造函数发生冲突。 C ++标准不允许:

  

[class.mem]/19

     

此外,如果类T具有用户声明的构造函数,则每个   T类的非静态数据成员的名称应与T不同。

Removing the constructor,或重命名变量将使其构建得很好。 class a的成员可以被命名为ait 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>

作为选项,您可以为成员变量ab使用不同的名称。