【发布时间】:2010-12-10 10:22:16
【问题描述】:
我正在研究定义真实和复杂数据类型的两个包装类。每个类都定义了重载的构造函数,以及四个算术运算符+、-、*、/和五个赋值运算符=、+=等。为了避免重复代码,我在考虑左右时使用模板函数- 运算符的手边参数属于不同的数据类型:
// 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) 错误'ac * br'中'operator*' 的模糊重载,因为编译器无法区分:
-
template <class T> friend const Complex operator*(const Complex&, const T&)[with T = Real] -
template <class T> friend const Real operator*(const T&, cont Real&)[with T = Complex]
有没有办法在 Real 类的模板 operator* 定义中指定 T 不能是 Complex?或者我是否必须不使用模板并为每个可能的参数数据类型组合定义每个运算符?或者有没有办法重新设计代码?
【问题讨论】:
标签: c++ templates operator-overloading