【发布时间】:2013-09-12 04:10:35
【问题描述】:
模板类实例如何接收同一模板类的不同类型的另一个实例作为其某些函数成员的参数? (我很难用更简单的方式表达我的问题,对此我感到非常抱歉。)
这是一个工作代码。我创建了一个类并将其命名为 MyClass。它在其 operator= 和 operator+ 成员函数上接受相同类型(即 int)的相同模板类。
#include <iostream>
using namespace std;
template<class T>
class MyClass {
protected:
T __val;
public:
MyClass();
MyClass(T val): __val(val) {}
void operator= (const MyClass<T>& r)
{
__val = (T)r.__val;
}
const MyClass<T>& operator+ (const MyClass<T>& r)
{
return *(new MyClass<T>(__val + (T)r.__val));
}
T retval() {return __val;}
};
int main()
{
MyClass<int> myclass1(1);
MyClass<int> myclass2(2);
MyClass<int> myclass3 = myclass1 + myclass2;
cout << myclass3.retval() << endl;
return 0;
}
出于以下目的,我对 operator= 和 operator+ 的参数的 __val 成员进行了类型转换:
int main()
{
MyClass<int> myclass1(1);
MyClass<double> myclass2(2.5);
MyClass<int> myclass3 = myclass1 + myclass2;
cout << myclass3.retval() << endl;
return 0;
}
显然我会得到一个错误。我不能将 myclass2 作为参数传递给 myclass1 的 operator+,因为 MyClass<int>::operator+ 想要 MyClass<int> 参数,而不是 MyClass<double>。我知道我可以重载另一个接受MyClass<double> 的运算符+,但我也想使用其他数字类型,如浮点数、单数等。为所有这些数字类型创建重载函数会使我的代码更大,我显然不这样做'不想发生。
我必须对 MyClass 进行哪些更改才能使我的第二个主要功能正常工作?
【问题讨论】:
-
return *(new-- NONONONONONONDONTWHYNOSTOP。 -
另外,
__names之类的保留用于实现,请勿使用。 -
Java++参考手册的另一章