【问题标题】:Nested Template Class嵌套模板类
【发布时间】:2017-11-16 10:06:29
【问题描述】:

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

错误:“模板类 MyClass”的模板参数列表中的参数 1 的类型/值不匹配 注意:需要一个类模板,得到'SpecificType {aka TemplateClass}

这是我的代码

/* ...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 对象,直到那时我的代码才能编译并工作。

【问题讨论】:

  • SpecificType 不再是模板(您已经向TemplateClass 提供了参数)。 MyClass&lt;TemplateClass&gt; 应该没问题

标签: c++ templates


【解决方案1】:

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

【讨论】:

  • 吹毛求疵:不确定“模板实例”一词。严格来说,没有模板的实例(对象意义上的实例......我知道你的意思,但它仍然可能被误解)。建议:替换为“具体类型(实例化模板)”(更清楚“实例化”的含义)
  • 感谢您的回答。你在第一部分是对的。在第二部分,即实例化中,看起来我应该知道具体的类型。假设 MyClass 在我的库中,我想指定库外的类型。我怎样才能通过它们?
  • @BartoloDellaCorte 只需让MyClass 接受一个类型作为模板参数(而不需要模板)
  • @BartoloDellaCorte:你应该简单地接受一个类型而不是一个模板......在我的回答中添加了这个。
  • @Klaus 我试图在MyClass 中对TemplateClass 中使用的三个类型名进行某种“可见性”,以获取一些静态成员值。也许我应该改变设计
猜你喜欢
  • 2018-11-08
  • 2011-05-04
  • 2017-02-05
  • 2016-01-11
  • 2018-11-26
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多