Может любой помогать мне с этим кодом. Я пытаюсь специализировать метод. В данный момент это не работает с одной специализацией (1), но я хотел бы в конечном счете иметь много специализаций (2, 3, 4, 5 и т.д.)
class X
{
public:
// declaration
template< int FLD >
void set_native( char *ptr, unsigned int length );
// specialisations
template<> void set_native< 1 >( char *ptr, unsigned int length )
{
}
};
Сообщения об ошибках, которые я получаю..
x.cpp:13: ошибка: явная специализация в непространстве имен определяет объем 'класса X' x.cpp:13: ошибка: шаблонный идентификатор 'set_native <1>' для 'пустого set_native (символ*, неподписанный интервал)' не соответствует никакому объявлению шаблона x.cpp:13: ошибка: недопустимое объявление функции
Как предложил Бенуа, вы должны специализировать функцию-член в окружающем пространстве имен:
struct X {
template<int N> void f() {}
};
template<> void X::f<1>() {} // explicit specialization at namespace scope
Это из-за §14.7.3 (C++03):
Явная специализация должна быть объявлена в пространстве имен, членом которого является шаблон, или, для шаблонов-членов, в пространстве имен, членом которого является охватывающий класс или шаблон охватывающего класса.
Однако VC не соответствует стандарту в этом отношении и, таким образом, создает некоторые проблемы с переносимостью.
Попробуйте следующее
class X
{
public:
// declaration
template< int FLD >
void set_native( char *ptr, unsigned int length );
};
// specialisations
template<> void X::set_native< 1 >( char *ptr, unsigned int length )
{
}
Если это не сработает, попробуйте добавить шаблонный класс за set_native
template<int FLD> class SetNative;
class X
{
public:
// declaration
template< int FLD >
void set_native( char *ptr, unsigned int length )
{ return SetNative()(ptr, length); }
};
template<> class SetNative<1>
{
void operator()( char *ptr, unsigned int length ){...}
};