C ++类型转换与隐式构造函数

时间:2011-06-01 21:28:07

标签: c++ casting type-conversion implicit-conversion

我正在实现一个表示分数的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 个答案:

答案 0 :(得分:3)

删除转化运算符,3 + a应该使用您的朋友operator+,同时通过隐式构造函数3隐式转换FractionFraction(int i);


编辑:在显式转换运算符的情况下,C ++ 0x特别允许这样:

  

12.3.2 [class.conv.fct] p2
  转换函数可以是显式的,在这种情况下,它仅被视为用户定义的直接初始化转换。

C ++ 03标准没有具体提到这一点。

答案 1 :(得分:3)

根据定义,转换运算符是隐式。你不能让它们明确。

正常的解决方案被命名为成员函数来进行转换。我想你也可以创建一个看起来像static_cast的专用模板方法,并调用显式类方法。