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)) ===|