具有'using'的模板模板成员继承
template template member inheritance with 'using'
以下类实现 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;
}
};
可以通过将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;
}
};
虽然第二个看起来更冗长一些,但在这种情况下,它似乎应该等同于第一个。有什么区别,为什么第一个的实现失败?
避免
注入类名的更简单的解决方法是使用全名::Derived
。
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;
}
};
演示
代码使用 gcc/clang 演示正确编译。
这是一个 msvc 错误,因为
在以下情况下,注入的类名被视为类模板本身的模板名:
- 其次是<</li>
- 它用作与模板模板参数对应的模板参数
- 它是友元类模板声明的详细类说明符中的最终标识符。
相关文章:
- 为什么我可以通过SubBase类的公共继承方法打印出基类的私人继承成员
- 派生类调用使用非继承成员的继承函数
- 如果存在具有不同参数的继承成员,为什么对 C++ 结构函数的调用不明确?
- C :原始成员与继承成员的优先级
- 更改继承成员的地址
- C 是否可以不继承成员
- 使用模板的继承阴影继承成员
- 继承成员功能的模板专业化
- 不允许继承成员,为什么
- 派生模板类和继承成员变量的语法谜题
- 继承成员地址的C++标准
- 多级继承成员访问
- 访问专用模板的私有/继承成员变量
- 基模板继承成员,减少所需的类型
- 继承成员函数指针
- 模板专用化类不继承成员
- C++14正在初始化类构造函数初始化列表中的继承成员
- 具有专门初始化的继承成员变量
- 模板继承成员字段
- 访问数据成员的继承成员函数