2016-08-05 4 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++テンプレートクラス継承、メンバ型の指定方法は?

は、しかし、私は本当にこれが欲しい、ATree上 std::vector<Anode<_datTy>>は時間をコンパイルし、B木の std::vector<Bnode<_datTy>>は時間をコンパイルします。

現在のアーキテクチャポイントでは、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

ありがとうございました!私はそのパターンを適用しようとします。 –

関連する問題