Ошибка компилятора с конструктором копирования двоичного дерева
Я пытаюсь написать эти функции для назначения, и я не могу понять, откуда эти ошибки или что они значат. У меня есть 2 класса, один для узла и один для двоичного дерева. Недавно я добавил некоторые функции и их реализации в основную функцию, и они вызывают проблемы (я думаю, в основном это общедоступные функции, которые вызывают частные). Если объявления функций выглядят странно, я прошу прощения, они были написаны моим инструктором, поэтому я не могу их изменить. Вот функции, с которыми я работаю (я вырезал то, что не актуально или ново):
template < class T > class binTree {
public:
binTree ( ) { // default constructor
root = NULL;
}
binTree ( const binTree<T>& Right ) { // Copy Constructor
root = copy(Right.root);
}
virtual ~binTree () { // Destructor
clear(root);
}
binTree<T>& operator = (const binTree<T>& Right) { // assignment operator
if (root != NULL)
clear(root);
root = copy(Right.root);
return *this;
}
void clear () {
clear(root);
}
protected:
binTreeNode < T >* root; // root of tree
private:
void clear (binTreeNode <T>*& p) {
if (p != NULL) {
clear(p->left);
clear(p->right);
delete p;
p = NULL;
}
}
binTreeNode<T>* copy(const binTreeNode<T>* p) {
if ( p != NULL ) {
binTreeNode<T>* newNode;
newNode = new binTreeNode<T>(*p); // modified
newNode->left = copy(p->left);
newNode->right = copy(p->right);
return newNode;
}
return NULL; // Added
}
Вот непонятный мусор, который мне дает мой компилятор:
In file included from prog7.cc:2:0:
binTree.h: In member function ‘binTreeNode<T>* binTree<T>::copy(const binTreeNode<T>*) [with T = int]’:
binTree.h:16:3: instantiated from ‘binTree<T>::binTree(const binTree<T>&) [with T = int]’
prog7.cc:13:36: instantiated from here
binTree.h:96:4: error: invalid conversion from ‘const binTreeNode<int>*’ to ‘int’ [-fpermissive]
binTreeNode.h:12:2: error: initializing argument 1 of ‘binTreeNode<T>::binTreeNode(const T&, binTreeNode<T>*, binTreeNode<T>*) [with T = int]’ [-fpermissive]
binTree.h: In member function ‘binTreeNode<T>* binTree<T>::copy(const binTreeNode<T>*) [with T = float]’:
binTree.h:24:3: instantiated from ‘binTree<T>& binTree<T>::operator=(const binTree<T>&) [with T = float]’
prog7.cc:29:14: instantiated from here
binTree.h:96:4: error: no matching function for call to ‘binTreeNode<float>::binTreeNode(const binTreeNode<float>*&)’
binTree.h:96:4: note: candidates are:
binTreeNode.h:12:2: note: binTreeNode<T>::binTreeNode(const T&, binTreeNode<T>*, binTreeNode<T>*) [with T = float]
binTreeNode.h:12:2: note: no known conversion for argument 1 from ‘const binTreeNode<float>*’ to ‘const float&’
binTreeNode.h:8:28: note: binTreeNode<float>::binTreeNode(const binTreeNode<float>&)
binTreeNode.h:8:28: note: no known conversion for argument 1 from ‘const binTreeNode<float>*’ to ‘const binTreeNode<float>&’
binTree.h: In member function ‘binTreeNode<T>* binTree<T>::copy(const binTreeNode<T>*) [with T = std::basic_string<char>]’:
binTree.h:16:3: instantiated from ‘binTree<T>::binTree(const binTree<T>&) [with T = std::basic_string<char>]’
prog7.cc:39:30: instantiated from here
binTree.h:96:4: error: no matching function for call to ‘binTreeNode<std::basic_string<char> >::binTreeNode(const binTreeNode<std::basic_string<char> >*&)’
binTree.h:96:4: note: candidates are:
binTreeNode.h:12:2: note: binTreeNode<T>::binTreeNode(const T&, binTreeNode<T>*, binTreeNode<T>*) [with T = std::basic_string<char>]
binTreeNode.h:12:2: note: no known conversion for argument 1 from ‘const binTreeNode<std::basic_string<char> >*’ to ‘const std::basic_string<char>&’
binTreeNode.h:8:28: note: binTreeNode<std::basic_string<char> >::binTreeNode(const binTreeNode<std::basic_string<char> >&)
binTreeNode.h:8:28: note: no known conversion for argument 1 from ‘const binTreeNode<std::basic_string<char> >*’ to ‘const binTreeNode<std::basic_string<char> >&’
binTree.h: In member function ‘binTreeNode<T>* binTree<T>::copy(const binTreeNode<T>*) [with T = int]’:
binTree.h:101:2: warning: control reaches end of non-void function [-Wreturn-type]
binTree.h: In member function ‘binTreeNode<T>* binTree<T>::copy(const binTreeNode<T>*) [with T = float]’:
binTree.h:101:2: warning: control reaches end of non-void function [-Wreturn-type]
binTree.h: In member function ‘binTreeNode<T>* binTree<T>::copy(const binTreeNode<T>*) [with T = std::basic_string<char>]’:
binTree.h:101:2: warning: control reaches end of non-void function [-Wreturn-type]
Кто-нибудь может увидеть, что я сделал не так в этих нескольких функциях? Я полностью рисую бланк.
EDIT:: Теперь я получаю ошибку сегментации, когда я вызываю мой конструктор копирования, но он компилируется. По запросу вот код для binTreeNode, но он только для справки, я знаю, что он работает нормально.
#pragma once
template < class T > class binTree;
template < class T > class binTreeNode {
friend class binTree < T >;
public:
// default constructor
binTreeNode ( const T& newData =T( ), binTreeNode < T >* newLeft = 0, binTreeNode < T >* newRight = 0 ) {
data = newData;
left = newLeft;
right = newRight;
}
private:
T data; // data value in node
binTreeNode < T > *left, *right; // links to other nodes
};
3 ответа
Здесь есть по крайней мере одна ошибка:
binTreeNode<T>* copy(const binTreeNode<T>* p) {
if ( p != NULL ) {
binTreeNode<T>* newNode;
newNode = new binTreeNode<T>(p);
Если вы пытаетесь сделать глубокую копию p
вам нужно разыменовать его в конструкторе копирования:
newNode = new binTreeNode<T>(*p);
Я думаю, вам нужно что-то вернуть в случае p == NULL
в методе копирования:
binTreeNode<T>* newNode = NULL;
if ( p != NULL ) {
newNode = new binTreeNode<T>(p);
newNode->left = copy(p->left);
newNode->right = copy(p->right);
}
return newNode;
И в C++ это обычно используется 0
вместо NULL
,
Ошибка всегда ссылается на binTreeNode. Почему бы вам не показать нам код определения binTreeNode?