2011-08-20 61 views
0

我試圖用鏘3.0編譯下面代碼靜態數組。 它沒有鏈接,我在這裏做得不對或這是一個編譯器錯誤?奇怪接頭誤差的INT

錯誤遵循建築x86_64的

未定義符號:在CC-JDTbNl.o LD __ZN9int_arrayIJLi0ELi1ELi2ELi3ELi4ELi5ELi6ELi7ELi8EEE5printEv ::未找到架構x86_64的

符號(多個)
「__ZN9int_arrayIJLi0ELi1ELi2ELi3ELi4ELi5ELi6ELi7ELi8EEE4listE」, 從參考

的代碼如下

#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允許在課堂上靜態成員的初始化?如果是這樣,叮噹還沒有實現它。如果沒有,你不能。 The (almost) standard,9.4.2項目3,說,任何常量文本類型可以initiazlied; 3.9條款10表示int數組是一個文字。所以,我想這是鐺3.0的一個bug,但有可能會進一步規則的可變參數模板的情況下...

不管怎樣,改變你的代碼如下所示爲我工作:

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

我想在類初始化僅允許用於靜態常量* *不可或缺的成員。 –

+0

謝謝你對此的迴應我會將這個作爲可能的bug提交給叮噹聲的人 – James

+0

@Kerek我認爲這是C++ 03的情況。在C++ 11中,可以對任何文字常量靜態成員進行類內初始化。 – Yuji

2

你編碼是錯誤的,原因有二

  • 如果不是整數或枚舉類型,而不是constexpr
  • 你錯過了一個定義int_array<yournumbers>::list您不能初始化類的靜態數據成員。當你使用該成員時,你需要定義它。

這不是一個鏗鏘錯誤。一旦叮噹獲得constexpr支持,並且當你添加out類的定義(這樣就不能有初始化器),並且你已經提供了一個類),並且用constexpr代替const,代碼就可以正常工作。


對於大衆,here is the PR that @James sent to Clang