Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要帮助来理解错误消息吗_C++_Constructor_Tree_Hierarchical - Fatal编程技术网

C++ 需要帮助来理解错误消息吗

C++ 需要帮助来理解错误消息吗,c++,constructor,tree,hierarchical,C++,Constructor,Tree,Hierarchical,编译代码时出现以下错误 代码: 为什么我会犯这些错误 我刚刚在class a和class b中定义了构造函数,成员变量int a的名称与注入的类名冲突,后者也是a 12班 在看到类名后立即将类名插入到声明它的范围中。类名也被插入到类本身的作用域中;这称为注入的类名。出于访问检查的目的,注入的类名被视为公共成员名 6.4名称查找 类的注入类名称(第12条)出于名称隐藏和查找的目的,也被视为该类的成员 作为一个选项,您可以为成员变量a和b使用不同的名称,您的成员变量和构造函数发生冲突。C++标准不允

编译代码时出现以下错误

代码:

为什么我会犯这些错误


我刚刚在
class a
class b
中定义了构造函数,成员变量
int a
的名称与注入的类名冲突,后者也是
a

12班 在看到类名后立即将类名插入到声明它的范围中。类名也被插入到类本身的作用域中;这称为注入的类名。出于访问检查的目的,注入的类名被视为公共成员名

6.4名称查找 类的注入类名称(第12条)出于名称隐藏和查找的目的,也被视为该类的成员


作为一个选项,您可以为成员变量
a
b
使用不同的名称,您的成员变量和构造函数发生冲突。C++标准不允许:

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


,或重命名该变量将使其生成良好。允许将
a类
的成员命名为
a
,并且。但我希望您看到,一旦您需要开始添加构造函数,它是多么有问题,因为在类外定义中,
a::a
指的是什么?解析一点也不愉快。

你调用了你的
和你的成员
int
同样的东西。这就是错误所说的:错误:字段'inta::a'与类同名。您能将代码格式化为可读的吗?合理的缩进和间距是必须的。这让我感到惊讶,这个问题无法解决;i、 我们必须使用不同的名称。你确定要删除构造函数吗?@Yola-是的,我确定。公式对我来说有点可疑,VS不接受这个代码。我知道它不是那么符合形,但仍然..@Yola-没有什么值得怀疑的
[class.mem]
是给出所有命名限制的地方。除非有托尔,否则没有限制。这意味着我们需要参考名称范围规则。我链接到的段落非常清楚。数据成员可以将类名隐藏在它出现的任何作用域中(包括类作用域)。@Yola-如果您仍然怀疑。考虑C允许成员用与结构标记相同的标识符来命名。这是一个兼容性特性(除非有一个c'tor,在这种情况下,没有必要讨论与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;}
/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)) ===|