Специализация шаблона с помощью struct и bool

У меня есть шаблонный класс, в котором я специализируюсь на нескольких методах. По какой-то причине, когда я добавил специализацию для структуры, мне показалось, что это противоречит специализации для 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>.

Любые идеи?


person AdamC    schedule 21.07.2010    source источник


Ответы (2)


(ИЗМЕНЕНО)

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

.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>;
person Benoît    schedule 21.07.2010
comment
Страдает точно такой же проблемой: пытается явно специализировать внутренний шаблон, не специализируя внешний. Даже если какой-то компилятор его принимает, он все равно недействителен C ++. - person AnT; 21.07.2010
comment
Действительно ? Я удивлен, но не спорю; я не стандартный эксперт. - person Benoît; 21.07.2010
comment
Стандартное обсуждение интересно, но для меня только в качестве примечания. Для меня важнее код, который компилируется и работает на последних версиях gcc и VS. @Benoit - спасибо за помощь! - person AdamC; 21.07.2010

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

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

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

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

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

person AnT    schedule 21.07.2010
comment
На самом деле, это нормально работало с другими типами. Я получил ошибку только после того, как добавил специализацию структуры. - person AdamC; 21.07.2010
comment
@AdamC: Иногда компилятор допускает код, который не соответствует стандарту - возможно, это так. По очевидным причинам зависеть от такого поведения очень опасно. - person j_random_hacker; 21.07.2010
comment
@AdamC: Это просто означает, что ваш компилятор предлагает вам некоторые расширенные возможности, которые на самом деле не имеют ничего общего с языком C ++. Трудно предсказать, как эта возможность должна работать, поскольку она не регулируется языком. Может быть, то, что вы наблюдаете, является предполагаемым поведением, а может быть, нет ... Обратитесь к документации вашего компилятора, поскольку, опять же, это не C ++. - person AnT; 21.07.2010