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

标签 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;
}

最佳答案

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

关于c++ - 调整具有非类型参数作为模板模板参数的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59939937/

相关文章:

c++ - boost::container::string 的内存是否连续?

c++ - 控制 `T` 绑定(bind)什么样的引用

c++ - 初始值设定项列表的模板替换错误

c++ - 可变参数模板中的模板参数推导失败

c++ - binary_search 通过其成员函数的返回变量查找类对象 [c++]

c++ - 所有可能的游戏分数的总和

c++ - 在 Visual Studio 2013 C++ 中使用零大小的数组

C++模板类型推导问题

C++11 可变参数模板函数调用转发

c++ - 如何根据模板类型定义浮点常量?