Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Smart pointers - как повторить архитектуру из


Автор: KaraKum 21.3.2009, 12:00
Доброе время суток.

Не пойму как компилится такая строчка:
osg::ref_ptr<osg::Referenced> referenced = new osg::Referenced();
(используется библиотека OpenSceneGraph).

Пытаюсь сымитировать такую же архитектуру следующим кодом:
Код

class Lab
{
    public:
        Lab& operator=(Lab *lab)
        {
            *this = *lab;
            return *this;
        }
};

template<class T>
class LabTemplate
{
    public:
        LabTemplate& operator=(T* ptr)
        {
            _ptr = ptr;
            return *this;
        }
        
    protected:
        T *_ptr;
};

LabTemplate<Lab> lab = new Lab;

При компиляции такая ошибка:
ошибка: запрошено преобразование от ‘Lab*’ к нескалярному типу ‘LabTemplate<Lab>’
Ну а вот так, конечно, компилится:
Код

LabTemplate<Lab> lab;
lab = new Lab;


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

P.S. Вот 2 загаловочныx файлы из библиотеки osg, касающиеся этого примера:

Автор: andrew_121 21.3.2009, 12:08
Тебе нужно перегрузить operator() для объекта.

Автор: mes 21.3.2009, 12:18
Цитата(andrew_121 @  21.3.2009,  11:08 Найти цитируемый пост)
Тебе нужно перегрузить operator() для объекта.

а может конструктор   ? -  LabTemplate(T*) ..

Автор: KaraKum 21.3.2009, 12:18
Какого объекта - LabTemplate или Lab?
Как переопределить и где он (этот оператор) должен вызываться?

Автор: mes 21.3.2009, 12:20
Цитата(KaraKum @  21.3.2009,  11:00 Найти цитируемый пост)
LabTemplate<Lab> lab = new Lab;

в этом случае "=" это не операция присваивания, а инициализация,
т.е  запись альтернатива  этой : LabTemplate<Lab> lab (new Lab);

Автор: KaraKum 21.3.2009, 12:24
Добавил ещё такой конструктор:
Код

Lab(Lab *lab)
{
    *this = *lab;
}

Такая же ошибка компиляции.

Автор: mes 21.3.2009, 12:26
Цитата(KaraKum @  21.3.2009,  11:24 Найти цитируемый пост)
Добавил ещё такой конструктор:

ну так не туда добавили smile ..  перечитайте посты выше smile

Автор: KaraKum 21.3.2009, 12:36
Точно! Теперь всё компилится  smile .

Кому интересно, код теперь выглядет вот так:
Код

class Lab
{
};

template<class T>
class LabTemplate
{
    public:
        LabTemplate(T *ptr)
        {
            _ptr = ptr;
        }
        
    protected:
        T *_ptr;
};

LabTemplate<Lab> lab = new Lab;


P.S. Незнание вот этого "тонкого" момента и вызвало проблему:
Цитата

в этом случае "=" это не операция присваивания, а инициализация,
т.е  запись альтернатива  этой : LabTemplate<Lab> lab (new Lab);


Спасибо за помощь!

Автор: andrew_121 21.3.2009, 12:43
mes, Да, и правда  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)