9

我碰巧写了这样的代码:

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;
}

我很困惑,不确定为什么原始代码无法编译以及“修复”如何工作。

任何的想法?

4

4 回答 4

14

有关详细信息,请参阅Vaughn 的答案。但是,如果您指定要使用而不是变量,则可以解决此问题:

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为变量/函数而不是结构/类。

于 2012-11-11T16:51:29.277 回答
5

一旦看到您声明的变量名称,它就可以访问。

所以在这段代码中:

a *a = new a;
           1

在第 1 点,a是指变量 a 而不是类 a。

当您这样做时:

a *b = new a;
a a;

这不是问题,因为b是不同的名称。

于 2012-11-11T16:49:05.260 回答
1

G++ 找到标识符a并认为您的意思是指针,而不是类名。您的行a *a = new a;与以下内容相同:

a *a;
a = new a;

在第二行中,G++ 感到困惑,因为您已经将其定义a为指针,而不是类名。

另一行a a;有效,因为它只是一个语句。

给类CamelCase(每个单词的第一个字母大写)名称和实例(变量名称)lower_caselowerCamelCase(有时称为mixedCase)名称通常是一个好主意。

于 2012-11-11T16:51:45.690 回答
0

您可以使用 typedef 临时为类型设置别名。

class a;
typedef a _a;
_a a;
void Get(_a a);
于 2013-02-21T23:31:05.463 回答