需要帮助以了解错误消息

Need help to understand the error message

本文关键字:错误 消息 了解 帮助      更新时间:2023-10-16

编译代码我得到以下错误

代码:

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

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

[class.mem]/19

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

删除构造函数或重命名变量将使其构建良好。允许class a的成员命名为a,它将隐藏注入的类名称。但是,我希望您看到一旦需要开始添加构造函数的问题,因为在班级定义中,a::a指的是什么?完全无法解析。

成员变量的名称int a注入class-name 的冲突,也是 a

12类[类]

插入一个类名称的范围,在该范围中,在看到类名称之后立即声明其范围。班级名称也插入了班级本身的范围。这被称为注入式名称。为了进行访问检查,注射级名称被视为是公共成员名称。

6.4名称查找[basic.lookup]

class 的注射类名称(第12条(也被认为是该类的成员,出于名称隐藏和查找的目的。。/p>

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