Если убрать аргументы nodeCopier
, эта часть мне не подходит ..
root=new QtreeNode;
root=nodeCopier( /* ... */ );
nodeCopier
возвращает QNode
(что на основании вашего утверждения return
неявноcastable from QtreeNode
) однако с первой строки мы можем присвоить QtreeNode*
.Или, говоря более широко, вы вводите в указатель количество не-указателя.
Похоже, что вы, возможно, хотели это сделать:
*root = nodeCopier( /* ... */ );
Вторая проблема, которую я вижу на основевторая строка здесь и сообщение об ошибке.
root=nodeCopier(*(source.root));
Qtree::nodeCopier(Qtree::QtreeNode* const&)
qtree.h:92: note: candidates are:
Qtree::QtreeNode Quadtree::nodeCopier(const Qtree::QtreeNode&)
Исходя из этого, похоже, что source.root
является QtreeNode**
, поскольку вы разыменовали его с помощью *
, и это выражение, очевидно, привело к QtreeNode*
.Либо это, либо root
делает какую-то забавную перегрузку оператора.В любом случае вы передали QTreeNode*
в функцию, ожидающую QTreeNode&
;Вы должны использовать **source.root
или (еще лучше) пересмотреть, если source.root
должен быть типа QtreeNode**
.(Я предполагаю, что это не так.)
Редактировать: Я согласен с тем, что другие говорят, что идиоматический способ C ++ заключается в создании конструктора копирования.Однако я предполагаю, что мой подход заключается в том, чтобы помочь объяснить, почему он не компилируется.Я думаю, чтобы помочь вам преодолеть концептуальный разрыв, было бы неплохо немного попрактиковаться с большим количеством манипуляций с указателями в стиле C ...