C ++ - 部分专门化模板类成员函数

时间:2013-12-27 01:05:54

标签: c++ templates

我有一对模板类,我正在尝试为其中一个类的一个成员函数创建一个特化。我的一般形式是:

template <typename T, int K>
class URLListNode {
    // Some other stuff
    void split( class URLListNode<T,K>*, class URLListNode<T,K> );
}

对于一般情况,我有:

template <typename T, int K>
class URLListNode<T,K>::split( URLListNode<T,K>* node1, URLListNode<T,K>* node2 ){
    // Code here
}

这很有效。我现在正试图为K = 1的情况创建一个专门化。以下是我到目前为止的情况:

template <typename T>
class URLListNode<T,1>::split( URLListNode<T,1>* n1, URLListNode<T,1>* n2 ) {
    // Code here
}

但是当我尝试编译时,我收到以下错误:

In file included from ../src/driver.cpp:34:0:
../src/urllist.h:101:80: error: invalid use of incomplete type ‘class URLListNode<T, 1>’
void URLListNode<T,1>::split( URLListNode<T,1>* node1, URLListNode<T,1>* node2 ) {
                                                                            ^
../src/urllist.h:29:7: error: declaration of ‘class URLListNode<T, 1>’
class URLListNode {
   ^
make: *** [src/driver.o] Error 1

这是关于g ++ - 4.8.2

3 个答案:

答案 0 :(得分:4)

主要有两种语法修复:

  • 分类定义结束时的分号。

  • class替换单词void作为函数定义的返回类型。

主要问题,你不能部分专门化一个功能。

部分专门化原始类不是一个好的解决方案,因为其他原始成员声明必须在专业化中继承或重复。

一般解决方案:使用类的静态函数成员,该成员可以是部分专用的。

#include <iostream>
using namespace std;

template <class T, int K>
class URLListNode {
    // Some other stuff
public:
    void split( URLListNode*, URLListNode* );
};

namespace detail {
    template <class T, int K>
    struct Impl
    {
        typedef URLListNode<T, K> Node;
        static void split( Node& self, Node*, Node* )
        { (void) self; cout << "Generic split" << endl; }
    };

    template <class T>
    struct Impl<T, 1>
    {
        typedef URLListNode<T, 1> Node;
        static void split( Node& self, Node*, Node* )
        { (void) self; cout << "Partially specialized split." << endl; }
    };

}  // namespace detail

template <class T, int K>
void URLListNode<T,K>::split( URLListNode* n1, URLListNode* n2 )
{
    detail::Impl<T, K>::split( *this, n1, n2 );
}

int main()
{
    URLListNode<int, 0>().split( 0, 0 );     // Generic.
    URLListNode<int, 1>().split( 0, 0 );     // Partially specialized.
}

答案 1 :(得分:2)

#include <iostream>

using namespace std;

template<class T, int K>
class URLListNode
{
public:
    void split(class URLListNode<T,K>*, class URLListNode<T,K>*)
    {
        cout << "split generic" << endl;
    }
};

template<class T>
class URLListNode<T, 1>
{
public:
    void split(class URLListNode<T, 1>*, class URLListNode<T,1>*)
    {
        cout << "split specific" << endl;
    }
};

int main()
{
    URLListNode<int, 1> x;
    x.split(&x, &x);

    cin.get();
}

这是你想要的吗?

答案 2 :(得分:0)

  

这就是我想要它做的事,但有没有办法做到这一点   没有创建一个完整的新模板类?我只有几个   函数来自一对相当复杂的类   专门。

您不能部分专门化成员函数。你必须专注于全班。

14.5.5.3.1。

  

类模板部分特化的成员的模板参数列表应与模板参数列表匹配   类模板部分特化。 a的模板参数列表   类模板部分特化的成员应匹配   模板参数列表的类模板部分特化。