2009-09-03 102 views
12

我不能爲我的生活弄清楚如何正確地做到這一點。我有一個需要存儲一些常量(對應於值的枚舉類型的文本)類 - 我有它在我的類中聲明是這樣的(公開):初始化字符串的靜態數組(C++)?

const static char* enumText[]; 

而且我想初始化像這樣:

const char* MyClass::enumText[] = { "A", "B", "C", "D", "E" }; 

但是GCC給了我以下錯誤:

'爲const char * MyClass的:: enumText []' 是不是 'MyClass類'

什麼時的靜態成員我做錯了?謝謝!

+0

嘗試:static const char * enumText [];在課堂裏? – 2009-09-03 22:20:28

+0

我強烈懷疑這是一些較老的g ++版本,它將'const static char * []'錯誤地當作'static char * [] const'而不是'static const char * []'(因爲'static'處於一個「不尋常」的地方)。 – 2009-09-03 22:45:46

+0

您可以將完整且可編譯的代碼粘貼到顯示問題的答案中嗎? – sbi 2009-09-04 07:58:58

回答

13

此代碼編譯:

struct X { 
    static const char* enumtext[]; 
}; 

const char* X::enumtext[] = { "A", "B", "C" }; 

檢查你的代碼,並找到差異。我只能認爲你沒有在類中定義靜態屬性,你忘記了包含標題,或者錯誤地輸入了名稱。

+9

第5行應該有'X :: enumtext',否則你只是創建一個新的變量。 – 2009-09-03 22:28:24

+0

這是一個錯誤的答案,我糾正了它。無論如何,代碼確實使用gcc進行編譯(MacOSX中的4.0和Ubuntu中的4.3) – 2009-09-04 11:59:27

+0

Wooo我覺得很愚蠢,我有一個我沒注意到的錯字。 – 2009-09-04 13:20:24

1

正如編譯器所說,你正試圖定義一個MyClass的靜態元素,它將是一個名爲enumText的const char *數組。如果你沒有在課堂上申報,那就有問題了。

你應該有:

class MyClass 
{ 
    //blah 
    static const char* enumText[]; 
}; 

或者你did'nt想要一個靜態成員。如果不是,你不應該在名字中使用一個類。

無論如何,這與數組初始化無關。

+0

歐普說:「我已經在我的課堂上公開了這樣的聲明」 – snarf 2009-09-03 22:47:17

+0

@Snarfblam:但是OP所說的和現實通常是兩回事 - 尤其是因爲他說他所做的事情應該起作用。 – 2009-09-03 22:50:32

1

下面的代碼編譯就好了,我在VS 2005:

class MyClass 
{ 
const static char* MyClass::enumText[]; 
}; 
const char* MyClass::enumText[] = { "A", "B", "C", "D", "E" }; 

如果我不得不採取胡亂猜測,我會說,你動初始化線是在一個單獨的源文件,你忘了#包含包含MyClass的.h文件。這正是我一直搞砸的事情。

另外,我認爲你很可能在錯誤的地方(或不足夠他們)const。現在你已經擁有了它的方式,它不是常量的數組,或者是數組中的指針;只是其中的字符元素。

6

這將編譯用gcc 4.0.1版本:

#include <iostream> 

class MyClass { 
public: 
    const static char* enumText[]; 
}; 

const char* MyClass::enumText[] = { "a", "b", "c" }; 

int main() 
{ 
    std::cout << MyClass::enumText[0] << std::endl; 
} 

編譯時:

g++ -Wall -Wextra -pedantic s.cc -o s 

你肯定MyClass的::enumText被引用正確的類?

2

鑑於錯誤消息,在我看來,你有一個MyClass聲明某處(在另一個標頭也許?),它沒有聲明enumText []。錯誤消息表明編譯器知道MyClass,但它不知道enumText成員。

我想看看您是否有多個暗示在陰影中的MyClass聲明。

你能拿wintermute'sT.E.D.'s的例子來編譯嗎?