我有一对模板类,我正在尝试为其中一个类的一个成员函数创建一个特化。我的一般形式是:
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
答案 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的模板参数列表 类模板部分特化的成员应匹配 模板参数列表的类模板部分特化。