嵌套模板类

时间:2017-11-16 10:06:30

标签: c++ templates

我正在尝试获取嵌套模板类 编译器给出了以下错误:

  

错误:模板参数列表中参数1的类型/值不匹配'模板类MyClass'   注意:期望一个类模板,得到'SpecificType {aka TemplateClass< Type1,Typ2,Type3>}

这是我的代码

/* ...class definition... */
template < template < typename T1,typename T2,typename T3 > typename T>
class MyClass{ 
    // is there a way to have these types available here
    // passing one single specialized type in the main?
    T1 member1;
    T2 member2;
    T3 member3;
    T<T1, T2, T3> member4;
};

/*  ...in my main... */
using SpecificType =  TemplateClass< Type1, Type2, Type3 >;
SpecificType test_object; //until here compiles
MyClass< SpecificType > myclass;

我已经尝试定义 SpecificType 对象,直到那时我的代码编译并运行。

1 个答案:

答案 0 :(得分:3)

您定义MyClass接受模板作为参数而不是类型。因此,您只需传递模板,例如TemplateClass本身。

所以你的定义说:我想要一个本身有三个模板参数的模板。因此,您必须传递模板,而不是模板的实例。

/* ...class definition... */
template < template < typename T1,typename T2,typename T3 > typename T>
class MyClass{ /*...*/};

template <typename T1, typename T2, typename T3>
class TemplateClass {};

/*  ...in my main... */
int main()
{
    MyClass< TemplateClass > myclass;
}

将模板传递给您的类后,在类中,您可以使用模板将其实例化为:

template < template < typename T1,typename T2,typename T3 > typename T>
class MyClass
{
    T<int, float, char> obj;
};

收到你的评论后,你想要一个不同的东西!你想传递一个类型,这里你想要一个模板的实例。所以只需执行以下操作:

/* ...class definition... */
template < typename T>
class MyClass
{ 
    T obj;
};

template <typename T1, typename T2, typename T3> 
class TemplateClass {}; 

int main()
{   
    MyClass< TemplateClass< int, float, char> > myclass;
}

现在要从OP获得第二个请求: - )

可以传递一个类型(例如,我们在这里看到实例化的模板)并从模板参数中获取类型。看这里:

template < typename T>
class MyClass;

template < template < typename ,typename ,typename  > typename T, typename T1, typename T2, typename T3>
class MyClass< T<T1,T2,T3> >
{
    T1 var1; // here you can use the types... 
    T2 var2;

    T<T1,T2,T3> obj;
};

template <typename T1, typename T2, typename T3>
class TemplateClass {};

int main()
{
    MyClass< TemplateClass< int, float, char> > myclass;
}