没有用于初始化模板化类的构造函数的匹配构造函数

时间:2014-02-26 00:28:13

标签: c++ templates

我正在尝试创建一个基于模板的树,其中节点是专用的,这样访问节点元素的方法和子节点返回子节点类型。以下是代码的删节版本。

template<class NodeObjectType, class ChildNodeObjectType, class ChildNode>
class Node {
public:
    Node(Node* parent, NodeObjectType* object);
    ChildNode* addAsChild(ChildNodeObjectType* object);
private:
    NodeObjectType* nodeObject;
    std::vector<ChildNode*> children;
};

typedef Node<B, void, void> BNode;
typedef Node<A, B, BNode> ANode;
typedef Node<void, A, ANode> RootNode;

/* constructor */

template<class NodeObjectType, class ChildNodeObjectType, class ChildNode>
ChildNode* Node<NodeObjectType, ChildNodeObjectType, ChildNode>::
  addAsChild(ChildNodeObjectType* object)
{
    ChildNode* child = new ChildNode(this, object);
    children.push_back(child);
    return child;
}

错误发生在addAsChild中的新ChildNode()调用中。我试图做一些无法做到的事情,或者我只是在某个地方犯了一些错误?

1 个答案:

答案 0 :(得分:1)

Node(Node* parent, NodeObjectType* object);

Node实际上是Node<NodeObjectType, ChildNodeObjectType, ChildNode>>

对于ANodeANode(ANode* parent, A*);

所以当你做类似的事情时:

A a;
RootNode root(nullptr, nullptr);
ANode anode(nullptr, &a);
root.addAsChild(&a);

你会致电ChildNode* child = new ChildNode(this, object); 或者换一些:

ANode child = new ANode(root, &a);
// error: no matching function for call to
// 'Node<A, B, Node<B, void, void> >::Node(Node<void, A, Node<A, B, Node<B, void, void> > >* const, A*&)'

由于RootNodeANode的类型不同(模板参数不同),因此存在编译错误。

也许你想要一些BaseNode作为父节点。