类的模板形参,该类也是模板形参

Template parameter for a class which is also a template parameter

本文关键字:形参      更新时间:2023-10-16

我试着这样做,我认为这个例子应该是不言自明的:

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

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

错误:expected unqualified-id

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

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

模板参数CLASS声明为classtypename,即类型的名称。

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();
}

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

除了@DanielJour和@Nasser给出的答案外,我想提一下,模板模板参数CLASS的类型名的名称T可以省略,因为它没有被使用。所以,浓缩溶液看起来是这样的:

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