具有相同类名的变量?

问题描述:

背后的原因是什么,我们不能在一个类中声明和定义一个变量(属性),而这个变量(属性)和类本身的名字相同?例如,这代码是不正确的(至少在MS VC++):具有相同类名的变量?

class test{ 

public: 
int test; 

}; 
+0

感谢您的注意。 – Aan

你的代码是合法的,如果MS VC++说,否则它是错误的。

在C++ 11,9.2/16:

另外,如果类T具有一个用户声明的构造(12.1),T级的每 非静态数据成员应有一个名字与T不同。

您的类没有用户声明的构造函数,并且您定义的数据成员是非静态的,因此它可以命名为test。如果它是静态的,则9.2/15表示它不能被命名为test,但9.2/15对非静态数据成员没有提及。

在C++ 03中,它是9.2/13和/ 13a,规则是相同的。

如果MS VC++发出警告,那么这可能是合理的。数据成员对C程序员的影响比C++程序员更有意义:

struct test{ 
    void foo(test &a) { // "test" is a type here 
     struct test t; // "test is not a type here, "struct test" is 
     a = t; 
    } 
    int test; 
}; 

struct test{ 
    int test; 
    void foo(struct test &a) { // now "test" is not a type here either 
     struct test t; 
     a = t; 
    } 
}; 
+0

谢谢,我试图找到:) –

构造函数的类的名字。

+0

构造函数是一种方法,我正在谈论一个属性。 – Aan

+0

奇怪的是,构造函数没有名称(12.1),但它们仍然可以影响名称空间中为什么用途保留的名称。我不知道动机是什么。 –

+0

这是猜测,但也许对于这种情况?这不是一个明智的做法。 –