2009-09-03 25 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 [];クラスで? –

+0

これは 'static static char * []'ではなく 'static char * [] const'として' const static char * [] 'を誤って扱っている古いg ++の古いバージョンだと強く思っています「珍しい」場所)。 –

+0

完全でコンパイル可能なコードを回答に貼り付けて問題を示してください。 – sbi

答えて

13

このコードはコンパイルされます。

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

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

はあなたのコードをチェックして、違いを見つけます。私はあなたがクラス内で静的属性を定義していないと思うだけで、ヘッダーを含めるのを忘れたか、名前を誤って入力したと思います。

+9

行5は 'X :: enumtext'を持つ必要があります。そうしないと、新しい変数を作成しています。 –

+0

それは答えのタイプミスで、私はそれを修正しました。とにかく、コードはgccでコンパイルされます(MacOSXでは4.0、ubuntuでは4.3) –

+0

Wooo私は愚かだと感じました。私は気付かなかったタイプミスがありました。 –

1

コンパイラが言っているように、enumTextという名前のconst char *配列になるMyClassの静的メンバーを定義しようとしています。クラスに宣言がない場合は、問題があります。

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

をまたは多分あなたは、静的メンバをしたいdid'nt:

あなたは持っている必要があります。そうでなければ、名前のクラスを使う必要はありません。

とにかく、配列の初期化とは関係ありません。

+0

Opは「私はそれを(公然と)私のクラスで宣言しました」 – snarf

+0

@Snarfblam:OPが言っていることと現実は2つの異なるものです。 –

1

次のコードは、VS 2005で私のためにうまくコンパイル:

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

私は野生の推測を取らなければならなかった場合、私はあなたのinitilizationラインが別のソースファイルであることを言うだろう、とあなたが忘れてしまいました#MyClassを含む.hファイルを#includeします。それはちょうど私がねじを締めて、常に行うことです。

また、あなたは間違った場所にconstを持っている可能性があります。あなたが今持っている方法、それは定数である配列、または配列のポインタではありません。その中の文字要素だけ。

6

これはgccのバージョン4.0.1でコンパイル:

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

はあなたがMyClassの::enumTextは、右のクラスを参照していることを確認しています:

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

はでコンパイル?

2

エラーメッセージが表示された場合、その中にenumText []が宣言されていない別のヘッダー(おそらくは別のヘッダーにある)のMyClassという宣言があるようです。エラーメッセージは、コンパイラがMyClassについて知っていることを示しますが、enumTextメンバについては認識していません。

私は影に潜んでいるMyClassという複数の宣言があるかどうかを調べたいと思います。

wintermute'sまたはT.E.D.'sのコンパイル例がありますか?