перегрузка шаблона и SFINAE работают только с функциями, но не с классами - PullRequest
16 голосов
/ 31 января 2012

может кто-нибудь объяснить, почему компилятор принимает только этот код

template<typename L, size_t offset, typename enable_if< (offset<sizeof(L)), int >::type =0>
void a_function(){}

template<typename L, size_t offset, typename enable_if< (offset==sizeof(L)), int >::type =0>
void a_function(){}

, но не этот:

template<typename L, size_t offset, typename enable_if< (offset<sizeof(L)), int >::type =0>
class a_class{};

template<typename L, size_t offset, typename enable_if< (offset==sizeof(L)), int >::type =0>
class a_class{};

Компилятор видит шаблон второго класса как переопределение первого.

Ответы [ 2 ]

13 голосов
/ 31 января 2012

Вы должны использовать специализацию для классов. Как правило, это делается с дополнительным параметром:

template <class P, class dummy = void>
class T;

template <class P>
class T<P, typename enable_if<something, void>::type> {
   the real thing
};

Два объявления класса (или шаблона класса) с одним и тем же именем должны всегда объявлять один и тот же класс или шаблон класса (или быть специализацией, в этом случае это все тот же шаблон).

1 голос
/ 31 января 2012

Вы, вероятно, хотите сделать что-то вроде этого ( ideone.com ссылка ):

#include <iostream>

template< typename PL, size_t pOffset, int pC = int( sizeof(PL) ) - int( pOffset ) >= 0 ? ( int( sizeof(PL) ) - int( pOffset ) == 0 ? 0 : 1 ) : -1 >
class TClass
{
};

template< typename PL, size_t pOffset >
class TClass< PL, pOffset, -1 >
{
 public:
  static int const sI = -1;
};

template< typename PL, size_t pOffset >
class TClass< PL, pOffset, 0 >
{
 public:
  static int const sI = 0;
};

template< typename PL, size_t pOffset >
class TClass< PL, pOffset, 1 >
{
 public:
  static int const sI = 1;
};

int main(void )
{
 TClass< char, 0 > lC0;
 TClass< char, 1 > lC1;
 TClass< char, 2 > lC2;

 std::cout << lC0.sI << " : " << lC1.sI << " : " << lC2.sI << std::endl;

 return ( 0 );
}

Вывод программы:

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