косяк с шаблонным классом
, template, наследование, инициализация в конструкторе
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.50] |
|
|
косяк с шаблонным классом
, template, наследование, инициализация в конструкторе
|
Сообщ.
#1
,
|
|
|
|
кратко обозвать проблему не сумел. как получится...
![]() ![]() class Tag { public: Tag( void ); //определён в сырце Tag( const char *name, const char *lB, const char *rB, int opt ); //этот тоже есть в сырце virtual ~Tag( void ); //аналогично virtual inline bool IsOpening(); //вертает false protected: char *tagName; int options; char *leftBracket; char *rightBracket; }; ...... template <class Base> class Opening : public Base { public: Opening( ); // пустой. ниже в этом же хидере virtual ~Opening( void ); virtual int SetClosing( Closing <Base> *cl ); virtual inline bool IsOpening(); // вернёт true private: Closing <Base> *closing; }; ...... template <class Base> class HTML : public Base { public: HTML(void); virtual ~HTML(void); }; template <class Base> HTML<Base>::HTML(void) { } template <class Base> HTML<Base>::~HTML(void) { } ........ class HTMLOpenTag : public HTML < Opening < Tag > > { public: HTMLOpenTag( const char *name, const char *lB, const char *rB, int opt ); virtual ~HTMLOpenTag(void); }; теперь пытаюсь в HTMLOpenTag поюзать конструктор Tag, тот, что параметры принимает: ![]() ![]() HTMLOpenTag::HTMLOpenTag( const char *name, const char *lB, const char *rB, int opt ) : Tag( name, lB, rB, opt ) { ; } ругается: error C2614: 'HTMLOpenTag' : illegal member initialization: 'Tag' is not a base or member если писать Tag::Tag(arguments), тоже ничего получается: error C2039: '__ctor' : is not a member of 'Tag' HTML<Opening<Tag > >::Opening<Tag>::Tag::Tag() - то же, что и в первом случае. ругается и на мембера, что он де не мембер вовсе... откуда руки растут, я знаю. вопрос - как исправить ситуёвину? забыл: VS 2003 |
|
Сообщ.
#2
,
|
|
|
|
Цитата ss @ error C2614: 'HTMLOpenTag' : illegal member initialization: 'Tag' is not a base or member Правильно, у тебя базовый Opening < Tag >, вот его и надо вызывать. А уже из него Tag |
|
Сообщ.
#3
,
|
|
|
|
а Tag значит уже не базовый?..
Opening - это что-то абстрактное открывающее. неважно что - тэги, окна, двери... а я буду в нём создавать конструкторы, которые параметрами берёт чёрт-те-что? ему ни имя (name тэга), ни что бы то ни было не нужно для создания экземпляра. на то он и шаблон у меня, чтоб только о себе заботиться. так что мне надо с самого низа иерархии вызывать именно самый верхний конструктор, минуя все промежуточные уровни. вобщем, не подходит. |
|
Сообщ.
#4
,
|
|
|
|
Цитата ss @ Это просто неправильно. По стандарту у конструкторов нет имен и их нельзя вызывать прямо(только косвенно через создание объекта), то, что MSVC это пропускает - это отклонение от стандарта.если писать Tag::Tag(arguments), тоже ничего получается В списке инициализации можно указывать только прямых предков. |
|
Сообщ.
#5
,
|
|
|
|
значит кроме как через явное задание значений полям класса в самом "нижнем" в иерархии конструкторе никак больше не сделать? код дублировать, значица, придётся?..
|
|
Сообщ.
#6
,
|
|
|
|
нашёл решение.
наследование должно быть виртуальным. тогда можно вызывать конструктор Tag( arguments ) напрямую. есть возражения? |