Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Шаблоны и наследники TObject  (Прочитано 7036 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
direktorSan
Удачи!
Участник

ru
Offline Offline
Пол: Мужской

« : 04-06-2007 13:45 » 

Добрый день.

Не подскажете ли решение вот какой проблемы.

Решил тут написать компонент с применением шаблонов. И как всегда напоролся на что-то.
В общем ситуация такая.

Есть шаблон класса с таким описанием (в отдельном файле):
Код:
#define _VV_TypeNamesDeclaration <typename AnyParentType>
#define _VV_TypeNamesList <AnyParentType>
//---------------------------------------------------------------------------
template _VV_TypeNamesDeclaration
class TVirtualView: public AnyParentType
{
public:
__fastcall TVirtualView(TComponent* Owner);
__fastcall ~TVirtualView(void);
};
//---------------------------------------------------------------------------
//###########################################################################
/*
Реализация методов класса
*/
//###########################################################################
//---------------------------------------------------------------------------
template _VV_TypeNamesDeclaration
__fastcall TVirtualView _VV_TypeNamesList
::TVirtualView(TComponent * Owner):AnyParentType(Owner)
{
}
//---------------------------------------------------------------------------
template _VV_TypeNamesDeclaration
__fastcall TVirtualView _VV_TypeNamesList::~TVirtualView(void)  (<== ПЕРВАЯ ОШИБКА)
{
}
//---------------------------------------------------------------------------

Далее.
Есть такая конструкция (в отдельном файле):

Код:
class c_RulerView; //предварительная декларация класса
typedef c_RulerView TRulerView_; //тип класса
typedef TRulerView_ * TRulerView_Ptr; //тип указателя на класс

typedef TVirtualView<TShape> TRulerView; //параметризация шаблона с одновременным определением типа

И, наконец, есть такое описание класса c_RulerView (тоже в отдельном файле):

Код:
class c_RulerView: public TRulerView 
{   (<== ВТОРАЯ ОШИБКА)
public:
__fastcall c_RulerView(TComponent * Owner, TRulerPtr vController);
__fastcall ~c_RulerView(void);
};

Т.е. ранее предварительно декларированный класс конкретизируется как потомок параметризованного шаблона.

Такая конструкция работает только в том случае, если при параметризации AnyParentType мы указываем любой класс не потомок TObject.

Но как только указываем наследника TObject, компилятор выдает две ошибки:
Первая ошибка - [C++ Error] VirtualView.h(37): E2080 '_fastcall TRulerView::~TVirtualView()' must be declared with one parameter

Вторая ошибка - [C++ Error] RulerView.h(8): E2029 'TRulerView' must be a previously defined class or struct

Если кто знает в чем здесь причина - скажите, пожалуйста!
И вообще, каким образом возможна параметризация шаблона потомками TObject?

Заранее спасибо.
Записан
direktorSan
Удачи!
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 04-06-2007 13:47 » 

Забыл сказать, что программирование ведется в Borland C++ Builder 5.0
Записан
korbian
Гость
« Ответ #2 : 21-06-2007 10:17 » 

Убери #define. ИМХО, код не читается вовсе.
TRulerView::~TVirtualView() не правильная сигнатура деструктора.
Приведи код без #define и typedef.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 21-06-2007 12:07 » new

direktorSan, никогда так не делай. Это просто незнаю что, уже сколько с шаблонами работаю, но что бы вот так шаблоны макросами, так извращённо оборачивали первый раз вижу.

первая ошибка.
Код:
template <typename AnyParentType>
class TVirtualView: public AnyParentType
{
public:
TVirtualView(TComponent* Owner);
~TVirtualView(void);
};

template <typename AnyParentType>
TVirtualView::TVirtualView(TComponent * Owner):AnyParentType(Owner)
{
}

template <typename AnyParentType>
TVirtualView::~TVirtualView(void)
{
}

вторая ошибка в том что у тебя не объявлен тип TRulerView в данной точке трансляции

что касется шаблонов, то их можно парметризовать любым типом
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines