2016-08-05 27 views
1
template <typename _datTy> 
class ANode{ 
typedef ANode<_datTy> _nodeTy; 
public: 
    std::vector<_nodeTy> childVector; 
}; 

template <typename _datTy, class _nodeTy = ANode> 
ATree 
{ 
public : 
    void doSomeThing() 
    { 
     auto iter = _root.childVector.begin(); 
    } 
protected: 
    _nodeTy _root; 
}; 




template <typename _datTy> 
class BNode : 
    public ANode<_datTy> 
{ 
typedef BNode<_datTy> _nodeTy; 
public: 
    bool somethingExtends; 
}; 
template <typename _datTy> 
BTree : 
    public ATree<_datTy, BNode<_datTy>> 
{ 
... 
}; 


BTree<char> test; 
test.doSomeThing(); 

Dieses Codeproblem ist std::vector<_nodeTy> childVector. Es ist zu std::vector<Anode<_datTy>> auf BTree kompilieren Zeit übersetzen.C++ Template-Klasse Vererbung, wie zu Member-Typ-Spezifikation?

Aber ich will das wirklich, std::vector<Anode<_datTy>> auf aTree Zeit kompilieren, und std::vector<Bnode<_datTy>> auf BTree Zeit kompilieren.

Ich verwende keinen Basisklassenzeiger wie diesen std::vector<_nodeTy *>, auf dem aktuellen Architekturpunkt.

Wie kann man dieses Problem lösen? Danke für Ihr Lesen.

Antwort

1

Sie suchen nach dem Curiously recurring template pattern. Etwas in diesen Zeilen:

template <typename NodeType> 
class XNode{ 
public: 
    std::vector<NodeType> childVector; 
}; 

template <typename DataType> 
class ANode : public XNode<ANode<DataType>> {}; 

template <typename DataType> 
class BNode : public XNode<BNode<DataType>> {}; 
+0

danke Ihre Antwort! Ich versuche, dieses Muster anzuwenden. –