我有一对模板类,我正在尝试为其中一个类的一个成员函数创建一个特化。我所拥有的一般形式是:
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/