На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS

Дорогие друзья! Поздравляем вас с Новым 2026 годом!

Всем удачи, успеха и благополучия!

msm.ru
Модераторы: Qraizer, Hsilgos
  
> косяк с шаблонным классом , template, наследование, инициализация в конструкторе
    кратко обозвать проблему не сумел. как получится...
    ExpandedWrap disabled
      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, тот, что параметры принимает:
    ExpandedWrap disabled
      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
    Сообщение отредактировано: ss -
      Цитата ss @
      error C2614: 'HTMLOpenTag' : illegal member initialization: 'Tag' is not a base or member

      Правильно, у тебя базовый Opening < Tag >, вот его и надо вызывать. А уже из него Tag
        а Tag значит уже не базовый?..
        Opening - это что-то абстрактное открывающее. неважно что - тэги, окна, двери... а я буду в нём создавать конструкторы, которые параметрами берёт чёрт-те-что? ему ни имя (name тэга), ни что бы то ни было не нужно для создания экземпляра. на то он и шаблон у меня, чтоб только о себе заботиться. так что мне надо с самого низа иерархии вызывать именно самый верхний конструктор, минуя все промежуточные уровни.

        вобщем, не подходит.
          Цитата ss @
          если писать Tag::Tag(arguments), тоже ничего получается
          Это просто неправильно. По стандарту у конструкторов нет имен и их нельзя вызывать прямо(только косвенно через создание объекта), то, что MSVC это пропускает - это отклонение от стандарта.

          В списке инициализации можно указывать только прямых предков.
            значит кроме как через явное задание значений полям класса в самом "нижнем" в иерархии конструкторе никак больше не сделать? код дублировать, значица, придётся?.. :(
              нашёл решение.
              наследование должно быть виртуальным. тогда можно вызывать конструктор Tag( arguments ) напрямую.
              есть возражения?
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0481 ]   [ 16 queries used ]   [ Generated: 13.01.26, 10:13 GMT ]