模板类的构造函数可以被特化吗?解决方案

模板类的构造函数可以被特化吗?
假如模板类针对某些特定的模板参数,它的构造函数需要做一些特殊性的处理,那么能不能用特化的方法实现?

------解决方案--------------------
你得特化整个类了。
------解决方案--------------------
template <>
A <C> ::A(int j, int i) { ... }
你这是类特化
template <>
A <C> (int j, int i) { ... }
应该这样
------解决方案--------------------
你的情况得特化整个类。
------解决方案--------------------
首先,你的模板类声明是:

template <class T>
class A
{
A(int){}//唯一的构造函数,其原型仅有1个int参数!
};

你期望的是对构造函数进行特化,即等同于对一个类模板成员函数的特化。且该类中只有一种原型的构造函数(仅有1个int参数!),那么你只能对这一原型的构造函数进行特化!

但是你的 "特化 "版本是:

template <>
A <C> ::A(int j, int i) {}

上述构造函数的原型(带有2个int型参数)明显不同于在模板声明中的那个构造函数原型!换句话说,编译器找不到你想特化的主模板,所以发生编译期错误:

'A <class C> ::A <class C> ' : overloaded member function 'void (int,int) ' not found in 'A <class C> '意思是上述函数不是该模板类的成员!

解决之道:

为你想特化的版本预先准备一个模板成员(构造)函数的主版本,例如:

template <typename T>
class A
{
public:

A(int){}
A(int,int){}//新的,你想特化成员(构造函数)的主版本!
};

class C;//我没有你的C类声明,故预引用!

//这就是你能得到的特化东东!
template <>
A <C> ::A(int j,int i)
{
cout < < "调用到了C特化版本的构造函数! " < < endl;//本语句纯为演示!
};

int main()
{
A <C> z(0,0);//必须显示使用2个int参数!

return 0;
}

上述程序在我的VC7.1、BC6.0及Gcc上运行,行为良好,屏幕输出:

"调用到了C特化版本的构造函数! "

由此可见,特化类模板的成员函数,必须要提供你想特化的成员函数的主模板!
------解决方案--------------------
fish6344(), 顶一下。