2011-08-20 2 views
0

私はClang 3.0で次のコードをコンパイルしようとしていました。 リンクに失敗しました。ここで何か間違っているのですか、これはコンパイラのバグですか?
"__ZN9int_arrayIJLi0ELi1ELi2ELi3ELi4ELi5ELi6ELi7ELi8EEE4listE"、 から参照: __ZN9int_arrayIJLi0ELi1ELi2ELi3ELi4ELi5ELi6ELi7ELi8EEE5printEv CC-JDTbNl.oのLDにある:記号(S)アーキテクチャx86_64の静的配列intでの奇妙なリンカーエラー

見つかりません

エラーは、アーキテクチャx86_64のため

未定義シンボルを次

コードは次のとおりです。

#include <iostream> 

static const int a[] = {0,1,2,3,4,5,6,7,8}; 

template<int... Numbers> struct int_array; 

template<int... Numbers> 
struct int_array { 
    int x; 
    const static int list[] = {Numbers...}; 
    static void print() { 
    for (const int x : list) { 
     std::cout << x <<std::endl; 
    } 
    } 
    static void print2() { 
    for (const int x : a) { 
     std::cout << x <<std::endl; 
    } 
    } 
}; 

typedef int_array<0,1,2,3,4,5,6,7,8> array_of_ints; 

int main (int argc, const char * argv[]) 
{ 
    array_of_ints::print(); 
    array_of_ints::print2(); 
    return 0; 
} 

答えて

1

私はC++ 0xのエキスパートではありません。もっと知りたい人がここに来ることを期待しています...しかし、C++ 0xでは、静的メンバーのクラス内初期化が可能ですか?もしそうなら、clangはまだそれを実装していません。そうでない場合、あなたはできません。 The (almost) standard、9.4.2アイテム3は、任意のconstリテラルタイプを初期化できます。 3.9項目10は、intの配列がリテラルであると示しています。だから、私は私のために働いて、次のようにコードを変更し、とにかく

...これが打ち鳴らす3.0のバグだと思いますが、可変引数テンプレートの場合、更なるルールがあるかもしれません。

template<int... Numbers> 
struct int_array { 
    int x; 
    const static int list[]; 
    static void print() ; 
}; 

template<int... Numbers> 
const int int_array<Numbers...>::list[]={Numbers...}; 

template<int... Numbers> 
void int_array<Numbers...>::print(){ 
    for (const int x : list) { 
     std::cout << x <<std::endl; 
    } 
} 
+0

私はクラス内の初期化は静的const * integral *メンバーのみに許可されていると思います。 –

+0

ありがとうございました。私はこれをclangみんなにバグとして提出します – James

+0

@KerekそれはC++ 03の状況でした。 C++ 11では、リテラルconst静的メンバーのクラス内初期化を行うことは問題ありません。 – Yuji

2

あなたコードは、それがないの整数または列挙型ではなくconstexpr

  • あなたはint_array<yournumbers>::listの定義を逃している場合は、クラスの静的データメンバを初期化することができない二つの理由

    • のために間違っています。そのメンバーを使用しているので、定義する必要があります。

    これはバグではありません。いったんclangがconstexprをサポートし、クラス内の定義を追加すると(すでに初期化されていない)、クラスの定義を追加して、constconstexprに置き換えると、コードは正しく動作するはずです。一般向け


    here is the PR that @James sent to Clang

  • 関連する問題