任何人都可以帮我解决这个问题。我正在尝试专门化一种方法。目前它不适用于一个专业化(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:错误:非命名空间范围'class X'中的显式特化 x.cpp:13:错误:template-id'set_native&lt; 1&gt;' for'void set_native(char *,unsigned int)'与任何模板声明都不匹配 x.cpp:13:错误:无效的函数声明
答案 0 :(得分: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 ){...}
};
答案 1 :(得分:1)
正如Benoit所提出的,你必须专门化周围命名空间中的成员函数:
struct X {
template<int N> void f() {}
};
template<> void X::f<1>() {} // explicit specialization at namespace scope
这是因为§14.7.3(C ++ 03):
然而,VC在这方面并不符合标准,从而造成一些可移植性问题。显式特化应在模板所属的命名空间中声明,或者对于成员模板,在封闭类或封闭类模板所属的命名空间中声明。