我碰巧写了这样的代码:
class a
{
public:
a() {}
};
int main()
{
a *a = new a; // line 10
a a; // line 11
return 0;
}
Run Code Online (Sandbox Code Playgroud)
g ++错误输出:
2.c: In function ‘int main()’:
2.c:10:16: error: expected type-specifier before ‘a’
2.c:10:16: error: cannot convert ‘int*’ to ‘a*’ in initialization
2.c:10:16: error: expected ‘,’ or ‘;’ before ‘a’
2.c:11:7: error: expected ‘;’ before ‘a’
Run Code Online (Sandbox Code Playgroud)
我发现,如果我在第10行将"a*a"更改为"a*b",那么g ++很高兴,这是一个很好的代码:
class a
{
public:
a() {}
};
int main()
{
a *b = new a;
a a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我很困惑,不知道为什么原始代码不编译以及"修复"如何工作.
任何的想法?
Zet*_*eta 12
有关详细信息,请参阅Vaughn的答案.但是,如果指定要使用类而不是变量,则可以解决此问题:
class a
{
public:
a() {}
};
int main()
{
a *a = new class a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
要么
int main()
{
class a a; // although the class word isn't needed here
return 0;
}
Run Code Online (Sandbox Code Playgroud)
回到C的时代,结构被放在他们自己的命名空间中.在C++中会发生类似的事情,但是,只要没有本地函数或具有相同名称的变量,类名就可以在其命名空间之外使用.
如果碰巧对类/结构A和变量/函数使用相同的名称,A则必须使用struct/ classkeyword,因为编译器将所有后续出现A的变量/函数解释为struct/class.
只要看到您声明的变量名称,就可以访问它.
所以在这段代码中:
a *a = new a;
1
Run Code Online (Sandbox Code Playgroud)
在第1点,a指的是变量a而不是类a.
当你这样做时:
a *b = new a;
a a;
Run Code Online (Sandbox Code Playgroud)
这不是问题,因为它b是一个不同的名称.