Типизация C ++ против неявного конструктора - PullRequest
4 голосов
/ 02 июня 2011

Я реализую c ++ - класс, представляющий дробь.Вот мой код.

class Fraction
{
    public:
        Fraction(char i);
        Fraction(int i);
        Fraction(short i);
        Fraction(long int l);
#ifdef __LP64__
        Fraction(long long l);
#endif
        Fraction(float f);
        Fraction(double d);
        Fraction(double x, double y);

        Fraction operator +() const;
        Fraction operator -() const;

        Fraction& operator +=(const Fraction& other);
        Fraction& operator -=(const Fraction& other);
        Fraction& operator *=(const Fraction& other);
        Fraction& operator /=(const Fraction& other);

        bool operator ==(const Fraction& other);
        bool operator !=(const Fraction& other);
        bool operator  >(const Fraction& other);
        bool operator  <(const Fraction& other);
        bool operator >=(const Fraction& other);
        bool operator <=(const Fraction& other);

        operator double();
        operator float();

        static void commonize(Fraction& a, Fraction& b);
        void shorten();

        double getNumerator();
        double getDenominator();

        friend Fraction operator +(Fraction const& a, Fraction const& b);
        friend Fraction operator -(Fraction const& a, Fraction const& b);
        friend Fraction operator *(Fraction const& a, Fraction const& b);
        friend Fraction operator /(Fraction const& a, Fraction const& b);
        friend ostream& operator <<( ostream& o, const Fraction f);

    protected:
        double numerator, denominator;

};

Теперь у меня две маленькие проблемы.Теперь попытка вызова

Fraction a(1, 2);
cout << (3 + a) << endl;

просто приводит к этой ошибке:

fractiontest.cpp:26: error: ambiguous overload for ‘operator+’ in ‘3 + a’
fractiontest.cpp:26: note: candidates are: operator+(int, double) <built-in>
fractiontest.cpp:26: note:                 operator+(int, float) <built-in>

Все, что я действительно хочу, это:

explicit operator double();
explicit operator float();

Но, очевидно, этоне работаетЯ хотел бы, чтобы эти два оператора приведения назывались, если я использую нотацию приведения.Например Fraction f(1, 2); double d = (double)(f);

Ответы [ 2 ]

3 голосов
/ 02 июня 2011

По определению операторы преобразования неявные . Вы не можете сделать их явными.

Обычное решение - именованные функции-члены, которые выполняют преобразование. Я думаю, вы также можете создать специализированный шаблонный метод, который будет выглядеть как static_cast и вызывать явный метод класса.

3 голосов
/ 02 июня 2011

Удалите операторы преобразования, и 3 + a должен использовать вашего друга operator+ при неявном преобразовании 3 в Fraction через неявный конструктор Fraction(int i);.


Редактировать : В случае операторов явного преобразования C ++ 0x специально разрешает это:

12.3.2 [class.conv.fct] p2
Функция преобразования может быть явной,в этом случае он рассматривается только как пользовательское преобразование для прямой инициализации.

Стандарт C ++ 03 конкретно не упоминает об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...