Исключение pointer_conflict документация состояния (sic):
pointer_conflict, // an attempt has been made to directly
// serialization::detail an object
// after having already serialzed the same
// object through a pointer. Were this permited,
// it the archive load would result in the
// creation of an extra copy of the obect.
Я думаю, что конфликт возникает, когда каждый сериализуется ptr в BaseNode::serialize
и через прямой объект, выражение *Node
, в Node::serialize
. Однако, поскольку функция base_object
принимает ссылку, а не ptr, я не уверен, как вы могли бы избежать этого.
Одна из возможностей - не сериализовать parent
ptr. Вместо этого после десериализации выполните обход дерева и исправьте родительские ptrs, чтобы они указывали на родительский узел. Например. добавьте следующий метод в BaseNode:
void fix (BaseNode* parent = 0)
{
this->parent = parent;
if (left != 0)
left->fix (this);
if (right != 0)
right->fix (this);
}
Тогда просто позвоните root->fix ()