Я изучаю перегруженные операторы на C++, и у меня есть проблема.Сбои с перегрузкой оператора или преобразования чисел
Я написал (примитивный) класс для представления доли в C++ и функцию для умножения двух из них.
Если я хочу умножить дробь на целое с помощью функции, все работает очень хорошо (благодаря конструктору преобразования: P). Но теперь я хочу умножить дроби на перегруженные *, точно так же, как два числа. Multiply first_fraction * second_fraction
работает хорошо, но компилятор не хочет преобразовывать числа в дроби в fraction * 2
. (Это Гав эту ошибку: ошибки C2666: «оператор *»: 2 перегруженных имеют аналогичные преобразования)
Если преобразовать его вручную, используя fraction*static_cast<CFraction>(2)
он работает снова.
Может ли кто-нибудь объяснить мне, что я делаю плохо? Вот полный код:
#include <iostream>
using namespace std;
class CFraction
{
private:
int m_numerator;
int m_denominator;
public:
// Normal constructor, default constructor and conversion constructor
CFraction(int numerator=0,int denominator = 1) : m_numerator(numerator), m_denominator(denominator)
{
}
int numerator() const { return m_numerator; }
void numerator(int numerator) { m_numerator = numerator; }
int denominator() const { return m_denominator; }
void denominator(int denominator) { m_denominator = denominator; }
// Conversion to decimal form
operator float()
{
return m_numerator/static_cast<float>(m_denominator);
}
};
// Function to multiply 2 fractions
CFraction multiplication(const CFraction& f1,const CFraction& f2)
{
return CFraction(f1.numerator()*f2.numerator(),f1.denominator()*f2.denominator());
}
// Overloaded opearator to multiply 2 fractions
CFraction operator *(const CFraction& f1,const CFraction& f2)
{
return CFraction(f1.numerator()*f2.numerator(),f1.denominator()*f2.denominator());
}
int main()
{
CFraction fraction1(3,4);
cout << "Fraction: "<< fraction1.numerator() << "/" << fraction1.denominator() << endl;
cout << "Decimal: " << static_cast<float>(fraction1) << endl;
// Multiplication by function works very well
CFraction result = multiplication(fraction1,2);
// (ERROR) Compiller won't convert 2 to CFraction class
CFraction result1 = fraction1*2;
// Using manually covnerted integer - works again
CFraction result2 = fraction1*static_cast<CFraction>(2);
cout << "Multiplied by 2: " << static_cast<float>(result);
getchar();
return 0;
}
PS. Я использую MS Visual C+++ 2010, если это дело
Благодарим вас за исчерпывающий ответ –
@ArkadiuszRosiak: Добро пожаловать, рад, что это помогло :) –