模板内的递归类型定义

时间:2014-09-12 21:00:04

标签: c++ variadic-templates

我想在variadic模板的帮助下将多维数组定义为vector<vector<....>>,但偶然发现定义类型initializer_list<initializer_list<...>>是不可能的,这是初始化列表构造函数所需要的。这可以通过以下代码进行简要说明

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;
};

编译器显示&#34;错误C2923:&#39; std :: initializer_list&#39; :&#39; MyArr :: ListType&#39;不是参数&#39; _Elem&#39;&#34;的有效模板类型参数。

定义ListType类型的正确方法是什么? 谢谢你的回答。

1 个答案:

答案 0 :(得分: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>;
    //                                ^^^^^^^^
};