шаблонная проблема специализации метода

Может любой помогать мне с этим кодом. Я пытаюсь специализировать метод. В данный момент это не работает с одной специализацией (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: ошибка: недопустимое объявление функции

1
задан ScaryAardvark 5 August 2010 в 15:29
поделиться

2 ответа

Как предложил Бенуа, вы должны специализировать функцию-член в окружающем пространстве имен:

struct X {
    template<int N> void f() {}
};

template<> void X::f<1>() {} // explicit specialization at namespace scope

Это из-за §14.7.3 (C++03):

Явная специализация должна быть объявлена ​​в пространстве имен, членом которого является шаблон, или, для шаблонов-членов, в пространстве имен, членом которого является охватывающий класс или шаблон охватывающего класса.

Однако VC не соответствует стандарту в этом отношении и, таким образом, создает некоторые проблемы с переносимостью.

1
ответ дан 2 September 2019 в 22:24
поделиться

Попробуйте следующее

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 ){...}
};
1
ответ дан 2 September 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: