【发布时间】:2020-01-28 12:00:27
【问题描述】:
我有一个模板可以简化为以下
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;
}
【问题讨论】:
-
签出this post: 看样子,在我看来你必须在NAdapter前面添加'模板'
::B -
不幸的是这不起作用,现在错误是“期望一个类模板,得到'typename NAdapter
::B'” -
Works for me 编辑:我原来的评论写错了,模板必须放在B前面
-
确实有效,非常感谢!
-
不要在你的问题中编辑答案。