以下类实现 CRTP。我想要上课Derived
使用提供的构造函数Base
,所以我写using
。但是,我收到错误消息“只能从直接基类继承构造函数”。等价于成员变量x
.
template<template<typename, size_t> typename G, typename F, size_t U>
struct Base
{
double x;
Base(double x) : x{ x } {}
double gimme_x()
{
return (*static_cast<G<F, U>*>(this)).gimme_x();
}
};
template<typename F, size_t U>
struct Derived : Base<Derived, double, U>
{
using Base<Derived, double, U>::Base;
using Base<Derived, double, U>::x;
double gimme_x()
{
return x + 1.8;
}
};
这个问题可以通过改变 template-template 的实现来缓解Base
仅使用常规模板。
template<typename G, typename F, size_t U>
struct Base
{
double x;
Base(double x) : x{ x } {}
double gimme_x()
{
return (*static_cast<G*>(this)).gimme_x();
}
};
template<typename F, size_t U>
struct Derived : Base<Derived<F, U>, double, U>
{
using Base<Derived<F, U>, double, U>::Base;
using Base<Derived<F, U>, double, U>::x;
double gimme_x()
{
return x + 1.8;
}
};
虽然第二个看起来有点冗长,但在本例中它似乎应该与第一个相同。有什么区别以及为什么第一个实施失败?