模板内的递归类型定义
问题描述:
我想用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
类型的正确方法是什么? 感谢您的回答。
答
MyArr<T, dim - 1>::
后面一切都是一个从属名称,因为这两个T
和dim
是模板的参数,因此,一个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>;
// ^^^^^^^^
};
是的,这个工作,非常感谢。我仍然不明白'typename'的位置背后的逻辑。 – 2014-09-12 21:09:07
@AlexB。它出现在你知道的某个类型之前,但是编译器不能推断出它是一个类型。例如,如果您专门为MyArr设置了一个'static int ListType',那么在'MyArr '中,'MyArr '不会命名一个类型。由于'T'还不知道,所以它不知道ListType是否是一种类型。你把'typename'放在整个东西之前,向编译器提示它应该假定它是一个类型。 –
cdhowie
2014-09-12 21:15:37
我看不出编译器如何推断'dim-1'? – 0x499602D2 2014-09-12 21:17:32