从模板类Base <A>派生类A,以便Base <A>可以使用A :: B?

美国国家森林研究委员会
template <typename T>
class Base
{
private:
    typename T::B c;
};

class A : public Base<A>
{
public:
    class B;
};

这样的事情可能吗?VC ++ 2013说B不是A的成员。

av

我会这样(直播示例):

template<typename T> struct Impl;
template<typename T> struct Nested;

template <typename T>
class Base
{
private:
    typename Nested<T>::type c;
};

struct A;

template<> struct Impl<A>   { class B { }; };
template<> struct Nested<A> { using type = typename Impl<A>::B; };

struct A : Base<A>, Impl<A>
{
    //...
};

在这里,classImpl包含A不依赖于的部分Base,即嵌套class B因此A现在导出Base<A>Impl<A>

Nested仅包含一个别名,用于指定上述嵌套类的类型。现在,Base从该类型读取此类型Nested并定义其数据成员。

我们需要声明A我们专门之前ImplNested它。在定义之前,我们需要那些专门知识,A因为此时Base<A>已实例化,并且这需要Nested<A>完整,而又需要Impl<A>完整。

Philip的答案的主要区别在于责任更加分离:

  • Base不会产生任何东西,因此被污染的可能性较小。我们仅将其数据成员的类型更改为typename Nested<T>::type

  • Nested是纯类型特征。它仅定义alias type此而已。

  • Impl是一个实现类。它包含嵌套类的定义,B或者可能包含任何不依赖的内容Base


顺便说一下,Stroustrup的C ++编程语言的第四版在771页上具有以下代码:

template<typename N>
struct Node_base : N::balance_type { };

template<typename Val, typename Balance>
struct Search_node : Node_base<Search_node<Val, Balance> >
{
    using balance_type = Balance;
};

有完全相同的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用body中的base:base从类模板派生的类

来自分类Dev

何时使用模板而不是派生类

来自分类Dev

是否可以使派生类的字段也派生?

来自分类Dev

C ++多态性:是否可以使用从双重派生类到基类的函数?

来自分类Dev

派生类构造函数何时被迫使用base关键字?

来自分类Dev

使用“ new”为派生类分配内存时,如何调用Base构造函数?

来自分类Dev

派生类模板

来自分类Dev

基类实现INotifyPropertyChanged:派生类型可以使用其PropertyChanged事件吗?

来自分类Dev

基类实现INotifyPropertyChanged:派生类型可以使用其PropertyChanged事件吗?

来自分类Dev

当A(派生类)“是” B(基类)时,我们使用继承。当A“可以”成为B或C时我们该怎么办?

来自分类Dev

使用派生类作为模板构造函数

来自分类Dev

对派生类中的成员变量使用派生类型

来自分类Dev

我可以使用C样式转换将派生类转换为私有基类吗?

来自分类Dev

派生类实例化BASE类的2个对象

来自分类Dev

从派生类调用base()来执行基类函数?

来自分类Dev

如何通过类型为base的指针访问派生类中的成员,但指向派生类

来自分类Dev

为什么派生类指针指向基类可以调用派生类成员函数?

来自分类Dev

我可以将派生类的模板参数转发到CRTP中的基类吗?

来自分类Dev

为什么我可以使用基础对象(非虚拟)调用派生类中定义的函数?

来自分类Dev

ObjectDataProvider可以与派生类一起使用吗?

来自分类Dev

使用派生类时的必要引用

来自分类Dev

在基本方法中使用派生类

来自分类Dev

使用派生类放置新的

来自分类Dev

在派生类中使用typedef /在模板化的基类中使用

来自分类Dev

使用CRTP时在基类中使用非模板派生类的typedef

来自分类Dev

是b2Body的派生类还是包含b2Body对象的类?

来自分类Dev

是b2Body的派生类还是包含b2Body对象的类?

来自分类Dev

为什么不能在带有模板的派生类中使用基类的别名?

来自分类Dev

是否可以使用基类构造函数使用派生类将值初始化为基类私有成员?

Related 相关文章

  1. 1

    使用body中的base:base从类模板派生的类

  2. 2

    何时使用模板而不是派生类

  3. 3

    是否可以使派生类的字段也派生?

  4. 4

    C ++多态性:是否可以使用从双重派生类到基类的函数?

  5. 5

    派生类构造函数何时被迫使用base关键字?

  6. 6

    使用“ new”为派生类分配内存时,如何调用Base构造函数?

  7. 7

    派生类模板

  8. 8

    基类实现INotifyPropertyChanged:派生类型可以使用其PropertyChanged事件吗?

  9. 9

    基类实现INotifyPropertyChanged:派生类型可以使用其PropertyChanged事件吗?

  10. 10

    当A(派生类)“是” B(基类)时,我们使用继承。当A“可以”成为B或C时我们该怎么办?

  11. 11

    使用派生类作为模板构造函数

  12. 12

    对派生类中的成员变量使用派生类型

  13. 13

    我可以使用C样式转换将派生类转换为私有基类吗?

  14. 14

    派生类实例化BASE类的2个对象

  15. 15

    从派生类调用base()来执行基类函数?

  16. 16

    如何通过类型为base的指针访问派生类中的成员,但指向派生类

  17. 17

    为什么派生类指针指向基类可以调用派生类成员函数?

  18. 18

    我可以将派生类的模板参数转发到CRTP中的基类吗?

  19. 19

    为什么我可以使用基础对象(非虚拟)调用派生类中定义的函数?

  20. 20

    ObjectDataProvider可以与派生类一起使用吗?

  21. 21

    使用派生类时的必要引用

  22. 22

    在基本方法中使用派生类

  23. 23

    使用派生类放置新的

  24. 24

    在派生类中使用typedef /在模板化的基类中使用

  25. 25

    使用CRTP时在基类中使用非模板派生类的typedef

  26. 26

    是b2Body的派生类还是包含b2Body对象的类?

  27. 27

    是b2Body的派生类还是包含b2Body对象的类?

  28. 28

    为什么不能在带有模板的派生类中使用基类的别名?

  29. 29

    是否可以使用基类构造函数使用派生类将值初始化为基类私有成员?

热门标签

归档