我正在尝试创建一个基于模板的树,其中的节点是专门的,以便访问节点和子节点元素的方法返回子节点类型。以下是该代码的简化版本。
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中的new ChildNode()调用中。我是在尝试做一些无法完成的事情,还是只是在某个地方犯了一些错误?
最佳答案
用Node(Node* parent, NodeObjectType* object);
Node
实际上是Node<NodeObjectType, ChildNodeObjectType, ChildNode>>
。
因此,对于ANode
:ANode(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*&)'
由于
RootNode
是与ANode
不同的类型(模板参数不同),因此存在编译错误。也许您想要一些
BaseNode
作为父节点。关于c++ - 没有用于模板化类的构造函数初始化的匹配构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22029205/