C++对象名与类名相同

my_*_*ion 8 c++

我碰巧写了这样的代码:

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.


Vau*_*ato 5

只要看到您声明的变量名称,就可以访问它.

所以在这段代码中:

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是一个不同的名称.