Задать вопрос
@kriptonus

Как определить виртуальные методы в полной специализации шаблона?

Добрый день. Подскажите в решении вопроса:
есть следующая структура классов

class Base
{
  virtual void f1()=0;
  virtual void f2()=0;
  virtual void f3()=0;
};

template <typename T, typename U>
class Derived:public Base
{
  
};

template <typename T>
class Derived<T, ulong>
{
void f1() override { std::cout<<"f1 partial spec ulong";}
};

template <>
class Derived<SomeType, ulong>
{
void f2() override { std::cout<<"f2 full spec ulong";}
void f3() override { std::cout<<"f3 full spec ulong";}
};

int main()
{
  Derived<SomeType, ulong> d;
}


Приводит к ошибке компиляции. Получается, что при полной специализации методы частичной специализации не используется и все виртуальные методы необходимо определять в полной специализации? Если же мне нужно определить общий метод, характерный для частичной специализации, но он еще и виртуальный, то нужно подкладывать какую-то функцию обертку?

Такого механизма, как сделать полную специализацию только метода не существует, как я понимаю (указать только частичную специализацию, а полную специализацию сделать так):
template <>
Derived<SomeType, ulong>::f2()
{
...
}
  • Вопрос задан
  • 66 просмотров
Подписаться 1 Средний 3 комментария
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Яндекс Практикум
    Мидл разработчик С++
    4 месяца
    Далее
  • Яндекс Практикум
    Разработчик C++ расширенный
    12 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Можно каждый метод отдельно в шаблон заворачивать, тогда не надо будет их все в каждой специализации копировать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы