проблема специализации шаблонного метода - PullRequest
1 голос
/ 05 августа 2010

Может кто-нибудь помочь мне с этим кодом. Я пытаюсь специализировать метод. В настоящее время он не работает с одной специализацией (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>' для 'void set_native (char *, unsigned int)' не соответствует ни одному объявлению шаблона x.cpp: 13: ошибка: недопустимое объявление функции

Ответы [ 2 ]

1 голос
/ 05 августа 2010

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

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

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

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

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

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

1 голос
/ 05 августа 2010

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

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 ){...}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...