调整具有非类型参数作为模板模板参数的模板

时间:2020-01-27 22:42:20

标签: c++ templates

我有一个模板,可以简化为以下模板

template <typename T, template <typename U> class Base>
class Derived: Base<T> {
};

作为Base,我希望能够使用可能具有非模板参数的模板。例如

template <unsigned N, typename T>
struct NBase {
};

这显然不能直接使用,因为它的参数与Base的单个参数不匹配,所以我想我会做类似的事情

template <unsigned S>
struct NAdapter {

   template <typename T>
   using B = NBase<S, T>;
};

这类作品,例如,编译如下:

void f() {
   Derived<int, NAdapter<100>::B> a;
}

但这无法编译

template <unsigned M>
void eval() {
  Derived<int, NAdapter<M>::B> b;
}

产生的错误是note: expected a class template, got ‘NAdapter<M>::B’

是否有一种方法可以将NBase修改为Base,使其在两种情况下都能正常工作?

解决方案

这行得通,谢谢@mutableVoid的建议!

template <unsigned M>
void eval() {
  Derived<int, NAdapter<M>::template B> b;
}

1 个答案:

答案 0 :(得分:0)

这是core issue 1478;如注释中所指出的,某些实现在这里需要::template。最current plan(我的)是要求该案例在没有template的情况下工作,并在此弃用它的不必要用法(与 parsing 目的不同)。实施可能要过一段时间才能遵循该规则,因为尚未对其进行审核。