类的模板参数,也是模板参数

时间:2015-07-10 09:28:50

标签: c++ templates

我尝试执行以下操作,我认为该示例应该是自我解释的:

template <class CLASS, class PARAM>
void call(){
  CLASS<PARAM>::do_something();
}

在第3行的CLASS和PARAM之间的尖括号上,编译器说:

  

错误:预期的unqualified-id

我可以解决这个问题,还是不允许我尝试做什么?

3 个答案:

答案 0 :(得分:4)

template <
    template <typename T> class CLASS,
    typename PARAM>
void call()
{
    CLASS<PARAM>::do_something();
}

答案 1 :(得分:3)

模板参数CLASS被声明为class,或者也是typename,即I.e。类型的名称。

template<typename X> struct A;

此处A不是类型,而是模板。要获取类型,您需要“应用”(*)模板:A<int>

如果您编写CLASS<PARAM>,则尝试将类型应用于某种类型。这不行。这就像尝试仅在类型级别调用值42(parameter)一样。

所以你需要指定CLASS是可以应用的东西,它是一个模板:

template <typename T> class CLASS

因此,作为参考,完整的解决方案是:

template <template <typename T> class CLASS, class PARAM>
void call(){
  CLASS<PARAM>::do_something();
}

(*)模板是类型级别的函数:它采用一种或多种类型,并返回一个新类型。

答案 2 :(得分:0)

除了@DanielJour和@Nasser给出的答案之外,我想提一下,模板模板参数T的类型名称CLASS可以省略,因为它不是用过的。因此,精简解决方案看起来像这样:

template <template <typename> class CLASS, typename PARAM>
void call()
{
    CLASS<PARAM>::do_something();
}

参考:Template Template Parameters