Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Smart pointers - как повторить архитектуру из, существующей библиотеки 
V
    Опции темы
KaraKum
  Дата 21.3.2009, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: 1
Всего: 1



Доброе время суток.

Не пойму как компилится такая строчка:
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, касающиеся этого примера:


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  headers.tar 20,00 Kb
PM MAIL WWW   Вверх
andrew_121
Дата 21.3.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Тебе нужно перегрузить operator() для объекта.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 21.3.2009, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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

Это сообщение отредактировал(а) mes - 21.3.2009, 12:23


--------------------
PM MAIL WWW   Вверх
KaraKum
  Дата 21.3.2009, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: 1
Всего: 1



Какого объекта - LabTemplate или Lab?
Как переопределить и где он (этот оператор) должен вызываться?
PM MAIL WWW   Вверх
mes
Дата 21.3.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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

Это сообщение отредактировал(а) mes - 21.3.2009, 12:23


--------------------
PM MAIL WWW   Вверх
KaraKum
  Дата 21.3.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: 1
Всего: 1



Добавил ещё такой конструктор:
Код

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

Такая же ошибка компиляции.
PM MAIL WWW   Вверх
mes
Дата 21.3.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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


Это сообщение отредактировал(а) mes - 21.3.2009, 12:31


--------------------
PM MAIL WWW   Вверх
KaraKum
Дата 21.3.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: 1
Всего: 1



Точно! Теперь всё компилится  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);


Спасибо за помощь!
PM MAIL WWW   Вверх
andrew_121
Дата 21.3.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



mes, Да, и правда  smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0621 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.