2014-09-12 184 views
0

我想用variadic模板的幫助定義多維數組,但偶然發現無法定義類型initializer_list<initializer_list<...>>,這是initializer-list-constructor所需要的。這可以簡單地通過下面的代碼模板內的遞歸類型定義

template<class T, size_t dim> 
class MyArr : vector < MyArr < T, dim - 1 >> 
{ 
public: 
    typedef initializer_list<MyArr < T, dim - 1 >::ListType> ListType; 
    //using ListType = typename initializer_list<MyArr < T, dim - 1 >::ListType>; 
}; 

template<class T> 
class MyArr<T, 1> : vector < T> 
{ 
public: 
    typedef initializer_list<T> ListType; 
}; 

編譯器會顯示來證明「:‘的std :: initializer_list’:錯誤C2923‘myArr,該:: ListType’不是參數‘_Elem’有效的模板類型參數」。

定義ListType類型的正確方法是什麼? 感謝您的回答。

回答

5

MyArr<T, dim - 1>::後面一切都是一個從屬名稱,因爲這兩個Tdim是模板的參數,因此,一個typename關鍵字是必要的,以指示它是一個類型。

template<class T, size_t dim> 
class MyArr : vector < MyArr < T, dim - 1 >> 
{ 
public: 
    typedef initializer_list<typename MyArr < T, dim - 1 >::ListType> ListType; 
    //      ^^^^^^^^ 
}; 

或:

template<class T, size_t dim> 
class MyArr : vector < MyArr < T, dim - 1 >> 
{ 
public: 
    using ListType = initializer_list<typename MyArr < T, dim - 1 >::ListType>; 
    //        ^^^^^^^^ 
}; 
+0

是的,這個工作,非常感謝。我仍然不明白'typename'的位置背後的邏輯。 – 2014-09-12 21:09:07

+0

@AlexB。它出現在你知道的某個類型之前,但是編譯器不能推斷出它是一個類型。例如,如果您專門爲MyArr 設置了一個'static int ListType',那麼在'MyArr '中,'MyArr '不會命名一個類型。由於'T'還不知道,所以它不知道ListType是否是一種類型。你把'typename'放在整個東西之前,向編譯器提示它應該假定它是一個類型。 – cdhowie 2014-09-12 21:15:37

+0

我看不出編譯器如何推斷'dim-1'? – 0x499602D2 2014-09-12 21:17:32