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