C ++ shared_from_this () возвращает исключение с шаблоном класса - PullRequest
0 голосов
/ 02 декабря 2018

У меня проблема с shared_ptr и указателем 'this'.Я нашел решение использовать enable_shared_from_this, но:

std::shared_ptr<Binary_search_tree> x = shared_from_this();

выдает исключение.Как правильно использовать его в моем случае?

вот код с контекстом:

#pragma once
#include <memory>
#include <string>

bool def_comparator(int x, int y) {
    if (x>y)
    {
        return true;
    }
    else {
        return false;
    }
};

template <typename T>
class Binary_search_tree : public std::enable_shared_from_this<Binary_search_tree<T>>
{
public:
    std::shared_ptr<Binary_search_tree> up;
    std::shared_ptr<Binary_search_tree> left;
    std::shared_ptr<Binary_search_tree> right;
    int key;
    T data;
bool(*comparator)(int, int);

Binary_search_tree(T x, const int key, bool(*comparator)(int, int))
{
    if (comparator==NULL)
    {
        this->comparator = &def_comparator;
    }
    else {
        this->comparator = comparator;
    }
    this->data = x;
    this->key = key;
}
Binary_search_tree()
{
}
~Binary_search_tree()
{
}

bool insert(T data, const int key)
{
    std::shared_ptr<Binary_search_tree> y;

    std::shared_ptr<Binary_search_tree> x = shared_from_this();
    if (comparator(key, x->key))
    {
        x = x->left;
    }
    else {
        x = x->right;
    }
    while (x != NULL)
    {
        y = x;
        if (comparator(key,x->key))
        {
            x = x->left;
        }
        else {
            x = x->right;
        }
    }
    Binary_search_tree<T> *tmp = new Binary_search_tree<T>(data, key, this->comparator);
    tmp->up = y;
    if (tmp->key == y->key)
    {
        return false;
    }
    if (comparator(tmp->key,y->key))
    {
        y->left = shared_ptr<Binary_search_tree<T>>(tmp);
    }
    else {
        y->right = shared_ptr<Binary_search_tree<T>>(tmp);
    }
    return true;
    }
}

РЕДАКТИРОВАТЬ: я добавил всего insert код метода @Tyker я надеваюне пытайтесь получить доступ к членам таким образом, мне нужно пройтись по моему дереву, чтобы добавить новый элемент, используя указатели x и y.Если «следующий элемент» отсутствует, указатель остается без изменений, а затем добавляется новый элемент.@GM ты имеешь в виду что-то вроде этого:

std::shared_ptr<Binary_search_tree<T>> x(new Binary_search_tree<T>); 
x = shared_from_this();
...