2016-05-10 4 views
-3

以下は、配列が静的であるかどうかに基づいて配列のサイズを取得する際に問題があるコードセクションです。const char * const a [30]のサイズを取得すると、オブジェクトの初期化前にサイズを判断できない

struct foo 
{ 
    static const char* const a[30]; 
    const char* const b[30]; 
    const int ia = __countOf(a) // compiles 
    const int ib = __countOf(b) // has compile errors related to initialization 
}; 
+1

あなたが問題を記述するために行うことができる非常に最善を「コンパイルされません」となっていますか? –

+0

申し訳ありませんが、私は言葉を聞かせてください、その私は対から取得するエラーは、コンパイルは、f2 – user1881587

+2

のメンバーではありませんV2039で失敗する定義の下のメンバー変数は、 –

答えて

5

最小限の例では、上記のコンパイルん...

しかし、あなたが本当に「私がfoo :: Bを参照するとき、なぜそれがコンパイルされません」して依頼する何を意味するのか?

これは、すべてのconstメンバをコンストラクタ(実際にはコンストラクタの初期化リストで、ボディではなく)で初期化する必要があるからです。 C++ 11のとして、あなたは、クラス定義のデフォルト値を提供することができます

#include <iostream> 

struct foo 
{ 
    static const char* const a[30]; // compiles 
    const char* const b[30] = {"Hello", "World" /*insert others here */ }; 
}; 


const char* const foo::a[30] = { 
    "Hello", "Cruel", "World", /* etc */ 
}; 

int main() 
{ 
    foo f; 
    std::cout << f.b[0] << std::endl; 
    std::cout << f.a[2] << std::endl; 
    return 0; 
} 
+0

コンパイルにはリンクステージが含まれていますね。 –

+0

@πάνταῥεcode私のためにリンクされた質問に掲載されたコード。不足しているメンバー定義を参照するものはありません。 –

+0

確かに、何もそれを参照しない場合、リンカは不平を言うことはありません。しかしOPは実際にどこかで参照されていることを指摘していなかったでしょう。 –

関連する問題