2016-08-05 75 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

谢谢你的答案!我尝试应用这种模式。 –