2011-11-30 119 views
3

背後的原因是什麼,我們不能在一個類中聲明和定義一個變量(屬性),而這個變量(屬性)和類本身的名字相同?例如,這代碼是不正確的(至少在MS VC++):具有相同類名的變量?

class test{ 

public: 
int test; 

}; 
+0

感謝您的注意。 – Aan

回答

8

你的代碼是合法的,如果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

謝謝,我試圖找到:) –

1

構造函數的類的名字。

+0

構造函數是一種方法,我正在談論一個屬性。 – Aan

+0

奇怪的是,構造函數沒有名稱(12.1),但它們仍然可以影響名稱空間中爲什麼用途保留的名稱。我不知道動機是什麼。 –

+0

這是猜測,但也許對於這種情況?這不是一個明智的做法。 –

相關問題