Получить базовый класс шаблона

Следующий код работает отлично (это упрощенная версия другой моей проблемы, с типами более длинными, более глубокими и более шаблонами):

template
struct Base
{};

template
struct Derived : public Base
{
   Derived() : Base()
   {}
};

Но как я могу вызвать конструктор базового класса без «записи» полного типа его базового класса? Например, я попробовал что-то вроде:

template
struct Base
{
   typedef Base base_type;
};

template
struct Derived : public Base
{
   Derived() : base_type() {}
};

int main()
{
   Derived b;
}

Но «base_type» не распознается. Сообщение, которое gcc бросает:

test3.cpp: In constructor 'Derived::Derived()':
  test3.cpp:100:17: error: class 'Derived' does not have any field
  named 'base_type'

To solve it I have to write Base::base_type in the constructor but this would make the existence of base_type itself irrelevant.

Не может ли моя кампания спасения?

И, почему base_type в конструкторе не найден, и все же это работает нормально?

int main()
{
   Derived::base_type b;
}

EDIT: With the comment of @Jack Aidley the best form I've found to get the type of the base class with a simple alias is:

template struct Base {};

template
struct Derived_impl : public Base
{
    Derived_impl() : Base()
    {}
};

template
using Derived = Derived_impl >;

int main()
{
   Derived b;
}
1
Кажется, хорошая идея. Спасибо.
добавлено автор Peregring-lk, источник
Любая причина, по которой вы не можете сделать template struct Derived: public Base ?
добавлено автор Jack Aidley, источник

2 ответы

Вы всегда можете это сделать:

template
struct Base
{
};

template
struct Derived : public Base
{
   typedef Base base_type; //define here

   Derived() : base_type() {}
};

Имеет смысл, если вы ссылаетесь на базовый тип в Derived ...

2
добавлено

Согласно стандарту

При поиске объявления имени, используемого в шаблоне   определение, обычные правила поиска (3.4.1, 3.4.2) используются для   независимые имена. Поиск имен, зависящих от шаблона   параметры откладываются до тех пор, пока не будет известен фактический аргумент шаблона   (14.6.2).

Это означает, что вы должны сообщить компилятору, что base_type в классе Base , который зависит от C . Вы можете использовать, например, следующее:

template
struct Derived : public Base
{
    using typename Base::base_type;

    Derived() : base_type() {}
};

или это

template
struct Derived : public Base
{
    Derived() : Derived::base_type() {} 

   //or, as you already told, Base::base_type()
};
2
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest