Частичная специализация шаблона класса для одной функции, как решить неопределенную ошибку других членов

У меня есть следующий класс шаблона. Мне нужно специализировать функцию alloc для определенного случая outT.

template <typename inT, typename outT>
class Filter {
public:

  typedef inT  InputType;
  typedef outT OutputType;

  struct Options {
    int a, b, c;
  };

  virtual void alloc();

};



// Partial template specialization for SpecificOutputType
template < typename inT>
class Filter<inT, SpecificOutputType> {

  virtual void alloc();

};

Это приводит к тому, что класс Options и OutputType не определены для gcc, например:

using FilterType = Filter<SomeIn, SpecificOutputType>:
FilterType::Options options;

Результаты в

 error: ‘Options’ is not a member of `Filter<SomeIn, SpecificOutputType>`

Эта ошибка не возникает, если я использую какой-либо тип, отличный от SpecificOutputType.

Как я могу это решить?


person manatttta    schedule 10.10.2016    source источник
comment
ты хотел сказать FilterType::Options options; ?   -  person 463035818_is_not_a_number    schedule 10.10.2016
comment
Специализация шаблона не копирует весь базовый шаблон + нужные вам изменения... вам нужно вставить всю реализацию... В качестве альтернативы вы можете иметь шаблонный базовый класс, скажем, FilterBase, и тогда фильтр по умолчанию не имеет изменений, и FilterSpecialisation должен переопределять только те функции, которые вам нужны.   -  person UKMonkey    schedule 10.10.2016


Ответы (1)


Каждая специализация шаблона независима, они не имеют отношения к основному шаблону, поэтому вы также должны явно определить Options, OutputType и другие необходимые элементы в специализации шаблона.

Элементы частичных специализаций не связаны с элементами основного шаблона.

Вы можете создать общий шаблон базового класса, чтобы избежать дублирования кода.

template <typename inT, typename outT>
class FilterBase {
public:

  typedef inT  InputType;
  typedef outT OutputType;

  struct Options {
    int a, b, c;
  };

};

template <typename inT, typename outT>
class Filter : public FilterBase<inT, outT> {
public:
  virtual void alloc();
};


// Partial template specialization for SpecificOutputType
template <typename inT>
class Filter<inT, SpecificOutputType> : public FilterBase<inT, SpecificOutputType> {
  virtual void alloc();
};
person songyuanyao    schedule 10.10.2016