GCC в открытом виде, здесь.У MSVC есть нестандартное расширение, которое позволяет специализацию в классе.Однако в стандарте говорится:
14.7.3.2:
2. Явная специализация должна быть объявлена в пространстве имен, членом которого является шаблон, или, для шаблонов элементов, впространство имен, членом которого является включающий класс или включающий шаблон класса.Явная специализация функции-члена, класса-члена или статического члена-данных шаблона класса должна быть объявлена в пространстве имен, членом которого является шаблон класса.
Кроме того, вы не можете частично специализировать функцию.(Хотя я не уверен в деталях в вашем деле, это будет последний удар.)
Вы могли бы сделать это:
#include <iostream>
struct true_type {};
struct false_type {};
template <typename T, typename U>
struct is_same : false_type
{
static const bool value = false;
};
template <typename T>
struct is_same<T, T> : true_type
{
static const bool value = true;
};
struct tag1 {};
struct tag2 {};
template< typename T >
struct C
{
typedef T t_type;
template< typename Tag >
void foo( t_type pX)
{
foo_detail( pX, is_same<Tag, tag1>() );
}
private:
void foo_detail( t_type, const true_type& )
{
std::cout << "In tag1 version." << std::endl;
}
void foo_detail( t_type, const false_type& )
{
std::cout << "In not tag1 version." << std::endl;
}
};
int main(void)
{
C<int> c;
c.foo<tag1>(int());
c.foo<tag2>(int());
c.foo<double>(int());
}
Хотя этонесколько некрасиво.