我正在实现一个表示分数的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);
答案 0 :(得分:3)
删除转化运算符,3 + a
应该使用您的朋友operator+
,同时通过隐式构造函数3
隐式转换Fraction
到Fraction(int i);
。
编辑:在显式转换运算符的情况下,C ++ 0x特别允许这样:
12.3.2 [class.conv.fct] p2
转换函数可以是显式的,在这种情况下,它仅被视为用户定义的直接初始化转换。
C ++ 03标准没有具体提到这一点。
答案 1 :(得分:3)
根据定义,转换运算符是隐式。你不能让它们明确。
正常的解决方案被命名为成员函数来进行转换。我想你也可以创建一个看起来像static_cast
的专用模板方法,并调用显式类方法。