2010-08-05 112 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:error:template-id'set_native < 1>'for'void set_native(char * ,unsigned int)'不匹配任何模板聲明 x.cpp:13:錯誤:無效函數聲明

回答

1

作爲貝努瓦建議,你必須專注於周圍的命名空間中的成員函數:

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)完全便攜性。 – 2010-08-05 16:10:42