2016-08-05 118 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(); 

此代碼問題是std::vector<_nodeTy> childVector。 它在BTree編譯時轉換爲std::vector<Anode<_datTy>>C++模板類繼承,如何向成員類型指定?

但我真的想這樣, std::vector<Anode<_datTy>>上ATREE編譯時間和 std::vector<Bnode<_datTy>>在B樹編譯時間。

在當前體系結構點上,我不使用基類指針std::vector<_nodeTy *>

怎麼想到這個問題? 感謝您的閱讀。

回答

1

您在查找Curiously recurring template pattern。沿着這些線:

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

謝謝你的答案!我嘗試應用這種模式。 –