我正在尝试获取嵌套模板类 编译器给出了以下错误:
错误:模板参数列表中参数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 对象,直到那时我的代码编译并运行。
答案 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;
}