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

标签 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 上

最佳答案

主要的两个语法修复:

  • 类定义末尾的分号。

  • 将函数定义的返回类型的 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.
}

关于C++ - 部分特化模板类成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20793345/

相关文章:

c++ - 如何在没有数学函数(arctan)的情况下计算点和 org(0,0) 之间的快速角度(最接近八个提供值之一)?

c++ - 以毫秒为单位的系统时间 C++

c++ - 根据 move 构造函数实现复制赋值运算符

php - 我如何为 Joomla 1.6 创建自定义错误页面 (404)?

c++ - 为什么 g++(4.6 和 4.7)将这个除法的结果提升为 double ?我能阻止吗?

django - PyCharm 5 找不到 Django 1.9 模板

c++ - 什么是 C++ 中的预存读取?

c# - 本地化应用名称

c++ - 设备函数指针作为模板参数

c++ - C++模板中的模板化对象