C++模板特化的问题

来源:百度知道 编辑:UC知道 时间:2024/06/17 23:31:41
我写了这样一个类模板:
template<class T> class Abc{
private:
......
public:
T &operator[](const int &);
T &operator[](const T &);
};

但是这样会出现一个问题,当T=int的时候会通不过编译,因为那两个成员函数是一样的了
我知道,有两个办法可以“解决”,
1. 使用特化,但是实际上,我的成员函数有很多,如果特化的话要重复写很多代码。
2. 在第一个函数或者第二个函数后面加上const使得参数列表不同,但是,这并不是我想要的效果,因为如果T=int的时候,参数都是int类型,我无法得知具体是哪个参数传到[]中的值。
还有其他方法可以很好地解决这么问题吗?
实际上,我写的就是两个参数,我只是为了让大家看明白简写了,就没有办法解决这个问题吗?
我不要其他弯曲的解决方法,要直接的,满意的追加

函数模板与同名的非模板函数的重载方法均遵循的约定:
(1)寻找一个参数完全匹配的普通函数, 如果找到了就调用它。
(2)在(1)失败后, 寻找一个函数模板, 使其实例化, 产生一个匹配的模板函数, 若找到了,就调用它。
(3)在(1)(2)均失败后, 再试一试低一级的对函数的重载方法,例如通过类型转换可产生参数匹配等, 若找到了,就调用它。
(4)若(1)(2)(3)均失败, 则这是一个错误的调用。

理论上讲,在候选调用存在二义性的情况下,会从可行函数集中优先选择适用的普通函数

现在编译通不过了,表明是调用必须实例化模板函数,而这里楼主给的都是需要实例化的模板函数,一旦调用,必进行实例化,就会产生二义性

我建议楼主改成带两个参数的模板,这样只需要一个模板函数就搞定了,既适合类型不同的又适合相同的,不会有二义性的问题了
template<class T1,class T2> class Abc{
private:
......
public:
T1 &operator[](const T2 &);
};

楼主:你既然是定义的是两个参数的模板template<class T1,class T2>
那为什么要定义两个模板函数:
public:
T &operator[](const int &);
T &operator[](const T &);
而不用一个:
T1 &operator[](const T2 &);

楼主。你说的不是很对的呢。
我就编译过了。dev c++和vc6.0都编译过了。
如何解决呢。我还是没有解决。

提供一种可能的解决方法,类似于operator++ 的实现
T& operator[](const int &) --> T& operator[](const int &, int=0);