2010-08-05 4 views
1

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

ответ

1

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

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

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

Это связано с §14.7.3 (C++ 03):

An explicit specialization shall be declared in the namespace of which the template is a member, or, for member templates, in the namespace of which the enclosing class or enclosing class template is a member.

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

1

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

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){...} 
}; 
+0

Подход №2 не требуется, первый совместим и (afaik) полностью переносится. –