Частичная специализация шаблона C ++: необъявленная ошибка идентификатора - PullRequest
0 голосов
/ 05 марта 2019

Целью написания этого кода было лучшее понимание частичной специализации шаблона. Я пытаюсь частично специализировать класс Vector с тремя различными типами bool.

У меня есть enum (для моего bool), определенный как:

enum MY_BOOL
{
   YES,
   NO,
   MAYBE
};

Для моего основного класса шаблона у меня есть

template<class A,MY_BOOL,class B>
class Vector{};

И у меня есть частичный класс специализации

template<MY_BOOL b>
class Vector<A,YES,B>{};

Компилятор жалуется на то, что A и B являются необъявленными идентификаторами и что частичный специализированный Vector имеет слишком мало аргументов. Не жалуется на «ДА» Это меня смущает, потому что A и B уже определены в первичном шаблонном классе. Мне не нужно помещать их обратно в список параметров частично специализированного класса, потому что смысл этого списка параметров состоит в том, чтобы иметь только те переменные, которые я хочу специализировать.

Ответы [ 2 ]

1 голос
/ 06 марта 2019

In

template<MY_BOOL b>
class Vector<A,YES,B>{};

Поскольку A и B не указаны, вы получаете ошибку компилятора.Он не будет использовать A и B из основного шаблона, он будет использовать только типы / значения, определенные в специализации.

Поскольку вам нужна специализация для каждого из значений перечисления, вы можете сделать это, например,

template<class A,MY_BOOL,class B>
class Vector {};

template<class A, class B>
class Vector<A, YES, B>{ /* YES stuff */ };

template<class A, class B>
class Vector<A, NO, B>{ /* NO stuff */ };

template<class A, class B>
class Vector<A, MAYBE, B>{ /* MAYBE stuff */ };

И теперь у вас есть специализация для каждого из перечислений.

0 голосов
/ 06 марта 2019

Частичная специализация для YES будет выглядеть следующим образом:

template<class A, class B>
class Vector<A, YES, B>
{ ... };

Смысл частичной специализации состоит в том, что вы предоставляете аргументы шаблона, отличные от базового шаблона, и сами заполняете отсутствующие параметры шаблона базового шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...