【问题标题】:Adapting a template with a non-type parameter as a template template parameter将带有非类型参数的模板适配为模板模板参数
【发布时间】: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&lt;M&gt;::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前面
  • 确实有效,非常感谢!
  • 不要在你的问题中编辑答案。

标签: c++ templates


【解决方案1】:

这是core issue 1478;正如 cmets 中所指出的,某些实现在此处需要 ::template。最current plan(我的)是要求这个案例在没有template 的情况下工作,并在那里弃用它不必要的使用(与其解析目的不同)。实施遵循该规则可能还需要一段时间,因为它甚至还没有经过审查。

【讨论】:

    猜你喜欢
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多