2016-12-04 77 views
0

在这种情况下,我的模板知识有点生疏。使用模板参数创建模板类型

内部A类(2个模板参数,T1T2模板化类),一个如何可以正确地声明在f()方法下面使用该函数的参数myType

template<typename T1, typename T2> 
class A 
{ 
    void f(T1<T2> myType); 
    void g(T2 myType2) 
} 

编辑:当使用时, T2是非模板类型,但T1是模板类型。

原因是我有T2可以单独使用,没有T1的用例。但是,我仍然想根据T1来定义T2(为了使依赖关系清晰)。

+0

你期望'void f(int myType);'要做什么?这没有意义。 –

+0

请显示一个简单的预期用例。 –

+0

您的混淆可能来自您对条款草率的使用。没有像“模板类型”那样的东西。有*类型*,并有*模板*。类型不是模板,模板也不是类型。类型可能来自模板的(专业化),但区分模板和专业化非常重要。 –

回答

0

T2是一个非模板化的类型,但T1为模板类型

在这种情况下,T1应该是一个模板的模板参数。
它遵循最小,工作示例:

template<template<typename> class T1, typename T2> 
struct S { 
    void f(T1<T2>) {} 
    void g(T2) {} 
}; 

template<typename> 
struct T {}; 

int main() { 
    S<T, int> s; 
    s.f(T<int>{}); 
    s.g(42); 
} 

进一步详情,请参阅here


但尽管如此,我想定义在T1 T2取决于如果你想清楚的依赖(使依赖清楚)

,你也可以通过强制执行使用部分专业化类似于下面的例子:

template<typename> 
struct S; 

template<template<typename> class T1, typename T2> 
struct S<T1<T2>> { 
    void f(T1<T2>) {} 
    void g(T2) {} 
}; 

template<typename> 
struct T {}; 

int main() { 
    S<T<int>> s; 
    s.f(T<int>{}); 
    s.g(42); 
} 
相关问题