2017-01-16 5 views
1

У меня возникли проблемы с созданием нового объекта путем «копирования» уже существующего объекта того же типа.Templated конструктор конструктора const const

template<class dataType> 
inline Node<dataType>::Node(const Node<dataType> & node) 
{ 
    if (this != nullptr) 
    { 
     this->mData = node.getData(); 
     this->mLeft = node.getLeft(); 
     this->mRight = node.getRight(); 
    } 
} 

Должен ли я использовать вышеуказанный? Или я должен просто сделать:

template<class dataType> 
    inline Node<dataType>::Node(const Node<dataType> & node) 
    { 
     this = node; 
    } 

Последний дает следующую ошибку:

1>h:\projects\binary search trees\data\classes\node.h(51): error C2440: '=': cannot convert from 'const Node<float> *' to 'Node<float> *const ' 
1> h:\projects\binary search trees\data\classes\node.h(51): note: Conversion loses qualifiers 

Бывший жалуется что-то подобное:

1>h:\projects\binary search trees\data\classes\node.h(51): error C2662: 'float Node<float>::getData(void)': cannot convert 'this' pointer from 'const Node<float>' to 'Node<float> &' 
1> h:\projects\binary search trees\data\classes\node.h(51): note: Conversion loses qualifiers 

Что я делаю не так?

+0

No, Node содержит только T mData и 2 указателя к узлу объектов. Это моя попытка реализации двоичных деревьев. Сгенерированный конструктор компилятора работает. Однако цель этого - обучение. Поэтому я был бы признателен, если бы кто-нибудь мог указать мне в правильном направлении. – ijustpostedsomethingdumb

+0

Что вы хотите, чтобы ваш конструктор копий делал? Просто скопируйте указатели или выполните глубокую копию всего дерева с этого узла? – TartanLlama

+0

Я хочу, чтобы он копировал указатели и данные, поскольку указатели уже имеют сохраненные левые и правые поддеревья. – ijustpostedsomethingdumb

ответ

1

Если вы где-то уже определен оператор присваивания, вы можете использовать

template<class dataType> 
    inline Node<dataType>::Node(const Node<dataType> & node) 
    { 
     *this = node; 
    } 

, чтобы повторно использовать код и не повторяться. * средства разыменование this указатель. Но ваш оператор назначения должен учитывать, что его можно вызывать для значения по умолчанию, заданного по умолчанию, как lvalue.

+0

Это сработало. Непреднамеренный каламбур. Благодаря! – ijustpostedsomethingdumb