Шаблон-предок получает класс потомка

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Фоб
Сообщения: 45
Зарегистрирован: 10 ноя 2006, 14:56

Шаблон-предок получает класс потомка

Сообщение Фоб » 22 дек 2007, 15:44

Вопрос по конструкции типа:

Код: Выделить всё

template <class Der>
class Base{
	// объект хранит операции над данными наследников, класс которых передаётся переменной <Der>
};

// описываю один из шаблонов наследников класса Base:

template <class C>                 
class Derived: public Base<Derived>{       
	// ...
};
Может, есть у кого-нибудь опыт практического использования таких конструкций?

Дело в том, что у меня это не компилируется, с жалобой "Cannot generate template specialization from Base<Der>"

Вроде бы должна работать, но что не так?

Например, вот так работает:

Код: Выделить всё

template <class Der>
class Base{
	// объект хранит операции над данными наследников, класс которых передаётся переменной <Der>
};

// описываю один из наследников класса Base:

class Derived: public Base<Derived>{       
	// ...
};
Но нужно, чтоб непременно класс-наследник был также шаблоном (поскольку это класс-контейнер элементов неизвестного наперёд типа).

Аватара пользователя
WinMain
Сообщения: 912
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Re: Шаблон-предок получает класс потомка

Сообщение WinMain » 24 дек 2007, 11:37

В шаблонах ATL такие конструкции повсеместно используются.
Приглашаю на свой сайт http://winmain.org

Фоб
Сообщения: 45
Зарегистрирован: 10 ноя 2006, 14:56

Re: Шаблон-предок получает класс потомка

Сообщение Фоб » 24 дек 2007, 14:15

Спасибо, нашёл подсказку в atlvcl.h
Правильно вот так:

Код: Выделить всё

template <class Der>
class Base{
};

template <class C>
class Derived: public Base< Derived<C> >{
};

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Re: Шаблон-предок получает класс потомка

Сообщение Romeo » 24 дек 2007, 14:31

Логично :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

Фоб
Сообщения: 45
Зарегистрирован: 10 ноя 2006, 14:56

Re: Шаблон-предок получает класс потомка

Сообщение Фоб » 24 дек 2007, 17:11

Ах, не смейтесь, конечно логично! Прям стыдно, что так просто разрешаются мои проблемки. :) Обещаю впредь больше думать, прежде чем спрашивать. Но вы тут так все всё знаете, соблазн велик, когда что-то не получается.

Ответить