Я работаю над двумя классами-оболочками, которые определяют реальные и сложные типы данных. Каждый класс определяет перегруженные конструкторы, а также четыре арифметических оператора +, -, *,/и пять операторов присваивания =, + = и т. Д. Чтобы избежать повторения кода, я думал об использовании функций шаблона, когда левое и правое -hand-боковые аргументы оператора имеют другой тип данных:Неоднозначная перегрузка операторов шаблонов
// 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;
}
возвращает компилятор (НКУ) ошибка неоднозначным перегрузки 'оператор *' in 'ac * ш», так как компилятор не может отличить:
template <class T> friend const Complex operator*(const Complex&, const T&)
[с T = Real]template <class T> friend const Real operator*(const T&, cont Real&)
[с T = Комплексно]
есть способ указать, что T не может быть комплексом в операторе шаблона * определение в классе Real? Или мне нужно обойтись без шаблонов и определить каждый оператор для каждой возможной комбинации типов данных аргументов? Или есть способ перепроектировать код?
Конструкторы должны быть сделаны явно (вопрос отредактирован). Однако в этом случае их явное не устраняет ошибку компиляции. – ASV