Я работаю над реализацией комплексных чисел. Класс Complex
имеет двух закрытых членов: real_part
и imaginary_part
. Я хотел бы переопределить операцию умножения следующим образом:
template<typename T, typename D>
friend Complex operator * (T lhs, D rhs)
{
double real_a;
double real_b;
double imaginary_a;
double imaginary_b;
if(std::is_same<T, Complex>::value)//if lhs is a Complex
{
real_a = lhs.real_part;
imaginary_a = lhs.imaginary_part;
}
else //base type, some sort of number
{
real_a = lhs;
imaginary_a = 0;
}
if(std::is_same<D, Complex>::value)//if rhs is a Complex
{
real_b = rhs.real_part;
imaginary_b = rhs.imaginary_part;
}
else //base type, some sort of number
{
real_b = rhs;
imaginary_b = 0;
}
Complex result;
result.real_part = (real_b*real_a- imaginary_b*imaginary_a);
result.imaginary_part = (real_b*imaginary_a + imaginary_b*real_a);
return result;
}
Мои конструкторы выглядят так:
Complex::Complex()
{
real_part = 0.0;
imaginary_part = 0.0;
}
и
Complex(T real, T imaginary)
{
real_part = real;
imaginary_part = imaginary;
}
Когда я пытаюсь умножить два Комплекса вместе:
Complex a(4.0, 8.0);
Complex b(8, 16);
auto prod = a*b;
auto prod2 = a * 2;
Я получаю следующую ошибку:
In file included from main.cpp:2:
complex.hpp: In instantiation of ‘Complex operator*(T, D) [with T = Complex; D = Complex]’:
main.cpp:13:17: required from here
complex.hpp:43:16: error: cannot convert ‘Complex’ to ‘double’ in assignment
real_a = lhs;
~~~~~~~^~~~~
complex.hpp:53:16: error: cannot convert ‘Complex’ to ‘double’ in assignment
real_b = rhs;
~~~~~~~^~~~~
complex.hpp: In instantiation of ‘Complex operator*(T, D) [with T = Complex; D = int]’:
main.cpp:14:20: required from here
complex.hpp:43:16: error: cannot convert ‘Complex’ to ‘double’ in assignment
real_a = lhs;
~~~~~~~^~~~~
complex.hpp:48:22: error: request for member ‘real_part’ in ‘rhs’, which is of non-class type ‘int’
real_b = rhs.real_part;
~~~~^~~~~~~~~
complex.hpp:49:27: error: request for member ‘imaginary_part’ in ‘rhs’, which is of non-class type ‘int’
imaginary_b = rhs.imaginary_part;
~~~~^~~~~~~~~~~~~~
Я пытаюсь перегрузить оператор таким образом (с двумя универсальными типами), чтобы избежать нескольких операторов перемножения перегрузки (то есть, где LHS является универсальным, а RHS имеет тип Complex, наоборот, и т. Д.). Буду признателен за любую помощь, поскольку я не уверен, что я делаю неправильно.