我的代码与this thread中的代码类似。
template<class T>
class BinarySearchTree
{
private:
struct tree_node
{
tree_node* left;
tree_node* right;
T data;
tree_node( const T & thedata, tree_node * l = NULL, tree_node * r = NULL )
: data( thedata ), left( l ), right( r ) { }
};
tree_node* root;
public:
BinarySearchTree()
{
root = NULL;
}
}
在我的主程序中,需要这样:
我有两棵树:
BinarySearchTree<T> tree1;
BinarySearchTree<T> tree2;
我需要创建一个新树:
root作为T的对象,left = tree1和right = tree2;
为此,我尝试添加此构造函数:
BinarySearchTree(const T& x, tree_node* l, tree_node* r);
并尝试从main调用:
BinarySearchTree<T> newTree(T object,tree1,tree2);
我知道这不起作用,但我该怎么办?
编译错误:
错误C2664:'BinarySearchTree :: BinarySearchTree(const T&amp;,BinarySearchTree :: tree_node *,BinarySearchTree :: tree_node *)':无法将参数2从'BinarySearchTree *'转换为'BinarySearchTree :: tree_node *'
答案 0 :(得分:1)
首先:你对构造函数的调用不正确,它应该是这样的:
BinarySearchTree<T> newTree(object,tree1,tree2);
我建议,实现一个所谓的复制构造函数,一个构造函数,将一个相同类的实例作为参数:
BinarySearchTree(const BinarySearchTree& other)
{
root = other.root; // propably you have to allocate it with "new"
}
这将允许您从子节点创建一个新树。
我希望我已经回答了你的问题,随时可以询问是否有任何不够清楚的问题! :)
答案 1 :(得分:1)
在实施您想要实现的目标后,您将面临许多问题。首先,按照您希望的方式加入树之后,您在根节点处存储的内容是最重要的,并且在许多情况下,结果树将不是二叉搜索树。你可以通过将引用传递给指向树的根节点的指针或指针来解决这个编译器问题。
void Join(const T & thedata, tree_node *& l, tree_node &* r );
答案 2 :(得分:0)
如果使用*定义函数参数,则表示编译器需要指向对象的指针。如果这样做,你必须提供对象的地址,而不是对象本身,如:
BinarySearchTree<T> newTree(object,&tree1, &tree2);
您可以更改调用方法的方式,也可以像修改const T&amp;更改方法定义以接受引用。