Я изучаю С++, и я создал два простых приложения hello-world. В обоих случаях я использую перегрузку оператора, но вот проблема. На первом я могу предоставить два аргумента для перегрузки оператора, и это нормально.
Заголовок:
enum Element {a,b,c,d,e};
Element operator + (Element x, Element y);
//more overloads for -, *, / here
Источник:
Element operator + (Element x, Element y) {
return ArrayOfElements[x][y];
}
Но в моем втором приложении (простой калькулятор сложных чисел) - этот метод не работал. После googling и выяснения причин, я в конечном итоге с этим кодом:
Заголовок:
struct Complex {
double Re;
double Im;
Complex (double R, double I) : Re(R), Im(I) { }
Complex operator + (Complex &Number);
//more overloads
};
Источник:
Complex Complex::operator + (Complex &Number)
{
Complex tmp = Complex(0, 0);
tmp.Re = Re + Number.Re;
tmp.Im = Im + Number.Im;
return tmp;
}
Теперь он работает, но я хочу знать, почему в первом фрагменте кода мне было разрешено помещать два аргумента в перегрузку operator
, но со вторым мне была дана следующая ошибка?
complex.cpp:5:51: error: 'Complex Complex::operator+(Complex, Complex)' must take either zero or one argument
Это то же самое, когда я использую классы или нет. Я искал много документов, и второй способ кажется более правильным. Может быть, это из-за разных типов аргументов?
Оба источника, скомпилированные с параметрами -Wall -pedantic
с использованием g++
, оба используют одни и те же библиотеки.