模板方法专业化问题

时间:2010-08-05 15:29:39

标签: c++ templates

任何人都可以帮我解决这个问题。我正在尝试专门化一种方法。目前它不适用于一个专业化(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:错误:无效的函数声明

2 个答案:

答案 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在这方面并不符合标准,从而造成一些可移植性问题。