我尝试执行以下操作,我认为该示例应该是自我解释的:
template <class CLASS, class PARAM>
void call(){
CLASS<PARAM>::do_something();
}
在第3行的CLASS和PARAM之间的尖括号上,编译器说:
错误:预期的unqualified-id
我可以解决这个问题,还是不允许我尝试做什么?
答案 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();
}