我碰巧写了这样的代码:
class a
{
public:
a() {}
};
int main()
{
a *a = new a; // line 10
a a; // line 11
return 0;
}
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’
我发现,如果我在第10行将“a * a”改为“a * b”,那么g ++很高兴,这是一个很好的代码:
class a
{
public:
a() {}
};
int main()
{
a *b = new a;
a a;
return 0;
}
我很困惑,不知道为什么原始代码无法编译以及“修复”如何工作。
有什么想法吗?
答案 0 :(得分:12)
有关详细信息,请参阅Vaughn's answer。但是,如果您指定要使用类而不是变量,则可以解决此问题:
class a
{
public:
a() {}
};
int main()
{
a *a = new class a;
return 0;
}
或
int main()
{
class a a; // although the class word isn't needed here
return 0;
}
回到C的时代,结构被放在他们自己的命名空间中。在C ++中会发生类似的事情,但是,只要没有本地函数或具有相同名称的变量,类名就可以在其命名空间之外使用。
如果您碰巧对类/结构A
和变量/函数A
使用相同的名称,则必须使用struct
/ class
关键字,因为编译器将所有后续出现的A
解释为变量/函数而不是struct / class。
答案 1 :(得分:5)
只要看到您要声明的变量名称,就可以访问它。
所以在这段代码中:
a *a = new a;
1
在第1点,a
指的是变量a而不是a类。
当你这样做时:
a *b = new a;
a a;
这不是问题,因为b
是一个不同的名称。
答案 2 :(得分:1)
G ++找到标识符a
并认为你的意思是指针,而不是类名。你的行a *a = new a;
与:
a *a;
a = new a;
在第二行中,G ++变得混乱,因为您已经将a
定义为指针,而不是类名。
另一行a a;
有效,因为它只是一个陈述。
通常一个好主意是让你的班级CamelCase
(每个单词的第一个字母是大写)名称,以及实例(变量名称)lower_case
或lowerCamelCase
(有时会被引用)以mixedCase
)名称。
答案 3 :(得分:0)
您可以使用typedef暂时为该类型添加别名。
class a;
typedef a _a;
_a a;
void Get(_a a);