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

Jef*_*f G 3 c++ templates using template-templates visual-studio

从奇怪的递归模板模式(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;
}
Run Code Online (Sandbox Code Playgroud)

在VS2019中,上述代码会出现以下错误:

错误 C3210: 'Base<double, Derived<double> >': 成员 using-declaration 只能应用于基类成员
错误 C3881: 只能从直接基类继承构造函数

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

Ayx*_*xan 5

这是有效的代码,并且可以使用 GCC 9.2 进行编译。尝试使用较新版本的编译器或其他编译器。或者联系您的实施者。

在那之前,这里有一个现在可以使用 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;
}
Run Code Online (Sandbox Code Playgroud)