我正在处理两个定义真实和复杂数据类型的包装类。每个类定义了重载的构造函数,以及四个算术运算符+, - ,*,/和五个赋值运算符=,+ =等。为了避免重复代码,我考虑使用左右模板函数 - 手侧操作者的参数是不同的数据类型的:模板运算符模糊过载
// real.h
class Real {
public:
explicit Real(const double& argument) {...}
explicit Real(int argument) {...}
...
friend const operator*(const Real&; const Real&);
template <class T> friend const Real operator*(const Real&, const T&);
template <class T> friend const Real operator*(const T&, cont Real&);
// Here, T is meant to be a template parameter for double and int
// Repeat for all other arithmetic and assignment operators
};
// complex.h
class Complex {
public:
explicit Complex(const Real& realPart) {...}
explicit Complex(const Real& realPart, const Real& imaginaryPart) {...}
// Overload for double and int data types
...
friend const operator*(const Complex&, const Complex&);
template <class T> friend const Complex operator*(const Complex&, const T&);
template <class T> friend const Complex operator*(const T&, cont Complex&);
// Here, T is is a template parameter for Real, double and int
...
};
这里的问题是,这样的代码:
//main.cpp
void main() {
Complex ac(2.0, 3.0);
Real br(2.0);
Complex cc = ac * br;
}
返回编译器(GCC)错误暧昧过载'operator *'in'ac * BR”,因为编译器不能告诉之间的区别:
template <class T> friend const Complex operator*(const Complex&, const T&)
[与T =真]template <class T> friend const Real operator*(const T&, cont Real&)
[与T =复]
是否有办法在模板运算符*中定义类Real时指定T不能成为Complex?或者我必须不使用模板,并为每个可能的参数数据类型组合定义每个运算符?或者有没有办法重新设计代码?
确实应该使构造函数明确(编辑问题)。但是,在这种情况下,使它们显式不会消除编译错误。 – ASV 2009-10-27 13:54:39