Добрый день.
Не подскажете ли решение вот какой проблемы.
Решил тут написать компонент с применением шаблонов. И как всегда напоролся на что-то.
В общем ситуация такая.
Есть шаблон класса с таким описанием (в отдельном файле):
#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?
Заранее спасибо.