我要猜你正在使用Visual C++,它有一個相當可怕的語言擴展,如"Microsoft Extensions to C and C++"描述:
出靜態常量積分(或枚舉)成員的類定義的
根據標準(/Za
),您需要爲數據成員創建一個類外定義。例如,
class CMyClass {
static const int max = 5;
int m_array[max];
}
...
const int CMyClass::max; // out of class definition
在/Ze
,外的類定義是可選的靜態,常量積分,和const枚舉數據成員。只有static和const的整數和枚舉可以在類中有初始化方法;初始化表達式必須是一個const表達式。
爲避免出現類外定義時的錯誤(當頭文件中提供了超類定義並且頭文件包含在多個源文件中時),應該使用selectany。例如:
__declspec(selectany) const int CMyClass::max = 5;
的/Ze
標誌默認情況下啓用。如果您不想使用語言擴展名,則必須明確使用/Za
標誌。
使用g ++ 4.5.2,Clang 3.0和Visual C++ 2010以及/Za
標誌設置,所編寫的代碼按原樣編譯和鏈接,沒有錯誤。
從.cpp文件中刪除定義解決了如果要使用Visual C++進行編譯的問題,但是如果嘗試使用數據成員,則不能與其他編譯器一起使用(或與/Za
一起使用)。對於便攜式解決方法,可以使用條件編譯模塊檢查擴展是否已啓用:
#ifndef _MSC_EXTENSIONS
const int A::b;
#endif
你正在使用哪種編譯器?我在Ubuntu上用g ++試了這個(添加了一個存根'main()',這樣鏈接器就可以運行)並且根本沒有任何警告。 「 – QuantumMechanic 2011-04-09 02:16:39