C++ 使用来自 CRTP 模板-模板基类的构造函数

标签 c++ visual-studio templates using template-templates

curiously recursing template pattern (CRTP) 继承构造函数的语法是什么?模板模板基类?

template<typename T, template<typename> typename U>
struct Base {
    Base(int) { }
};

template<typename T>
struct Derived : public Base<T, Derived> {
    using Base<T, Derived>::Base;
};

int main(int argc, char *argv[]) {
    Derived<double> foo(4);
    return 0;
}

在VS2019中,上述代码会导致如下错误:

error C3210: 'Base<double, Derived<double> >': a member using-declaration can only be applied to a base class member
error C3881: can only inherit constructor from direct base

使上述代码工作所需的语法是什么?

最佳答案

这是有效的代码,它 does compile with GCC 9.2 .尝试更新版本的编译器或不同的编译器。或联系您的实现者。

在那之前,这里有一个解决方法 does compile with MSVC现在:

template<typename T, template<typename> typename U>
struct Base {
    Base(int) { }
};

template<typename T>
struct Derived;

template<typename T>
using Base_type = Base<T, Derived>;

template<typename T>
struct Derived : public Base_type<T> {
    using Base_type<T>::Base;
};

int main() {
    Derived<double> foo(4);
    return 0;
}

关于C++ 使用来自 CRTP 模板-模板基类的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57937093/

相关文章:

c++ - Visual Studio 是否支持新的 C/C++ 标准?

c++ - 预处理器魔术来完成模板中的类型名

javascript - 如何在 CoffeeKup 模板中使用文字 HTML?

c++ - Ncurses 不滚动 stdscr,导致终端行为异常

c++ - 改运行时研究一个编译时间一

c++ - 将回声效果添加到 .wav 文件

regex - 如何在 Visual Studio 中将代码中的字符串转换为大写?

c# - VS2010拒绝编译命名空间,说它不存在

c++ - 当模板化类不包含可用的成员函数时,如何在编译时验证模板参数?

c++ - CMake 找不到包含文件