Шаблонная специализация с struct и bool - PullRequest
1 голос
/ 21 июля 2010

У меня есть шаблонный класс, в котором я специализируюсь на нескольких методах.По какой-то причине, когда я добавил специализацию для структуры, она, кажется, вступала в противоречие со специализацией для bool.Я получаю ошибку преобразования типа, потому что он пытается установить struct = bool (разрешение неправильной специализации).Вот некоторый код

.h:

typedef struct foo {
  ...
}

template <class T> class bar {
   template <class T> void method1() {...}
   template <> void method1<bool>() {...}
   template <> void method1<foo>() {...}
}

.cpp

 template class bar<bool>;
 template class bar<foo>;

Я получаю ошибку внутри method1<bool>, потому что вместо этого устанавливается T = fooразрешить это до method1<foo>.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 21 июля 2010

Первая часть вашего кода уже неверна. C ++ не поддерживает явную специализацию «вложенных» (элементов) шаблонов без явной специализации включающего шаблона.

В контексте вашего кода запрещается явная специализация метода шаблона method1 без явной специализации всего шаблона класса bar.

Если ваша шаблонная функция члена member1 зависит от некоторых параметров, вы можете использовать перегрузку вместо специализации шаблона в качестве обходного пути. Но так как это не так, вам придется каким-то образом переделывать свои шаблоны. То, что вы делаете выше, опять же, незаконно в C ++.

Ошибки, которые вы получаете дальше, легко могут быть (и, скорее всего, есть) вызваны этой первоначальной проблемой.

P.S. Описание проблемы, которую вы разместили, подразумевает, что ваш код компилируется. То, что вы разместили, не должно компилироваться по причинам, описанным выше. Это говорит о том, что вы публикуете поддельный код. Разместите реальный код.

1 голос
/ 21 июля 2010

(отредактировано)

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

.h:

typedef struct Foo {
  ...
}

template<class T_Bar, class T2> struct BarMethod1;
template <class T> class Bar 
{
   template<class T2> void method1(...)
   {
      BarMethod1<Bar, T2>(...)(...);
   }
}
template <class T_Bar, class T2> class BarMethod1 
   {void operator()(...){...}};
template <class T_Bar> class BarMethod1<T_Bar, bool>
   {void operator()(...){...}};

template <class T_Bar> BarMethod1<T_Bar, Foo>
   {void operator()(...){...}};

.cpp

 template class Bar<bool>;
 template class BarMethod1<Bar<bool>, bool>;
 template class BarMethod1<Bar<bool>, Foo>;
 template class Bar<Foo>;
 template class BarMethod1<Bar<Foo>, bool>;
 template class BarMethod1<Bar<Foo>, Foo>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...