2014-09-12 135 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