Article ID: 106392
Article Last Modified on 7/5/2005
int + FractionBecause there is no exact match to the operators provided for this operation, a set of candidate operator + must be determined.
+ ( long, const Fraction& ) + ( const Fraction&, long ) + ( const Fraction&, const Fraction& )Second, there are the built-in operators:
+ ( int, float )The above is chosen because it is "int" plus an arbitrary type, and the Fraction object can be converted only to a "float".
+ ( long, const Fraction& ) + ( const Fraction&, long ) + ( const Fraction&, const Fraction& ) + ( int, float )Because there is more than one choice, the overload disambiguation takes place.
+ ( long, ... ) Requires one standard conversion. + ( const Fraction&, ... ) Requires one user-defined conversion. + ( int, ... ) Is an exact match.Therefore, the set of best candidates for the first argument consists of:
+ ( int, float )Then the second argument is considered:
+ ( ..., const Fraction& ) Requires only trivial conversions.
+ ( ..., long ) Requires 1 user-defined conversion and
one standard conversion.
+ ( ..., float ) Requires one user-defined conversion.
Therefore, the set of best candidates for the second argument consists
of:
+ ( const Fraction&, const Fraction& ) + ( long, const Fraction& )The intersection of these two sets is NULL, it contains nothing, and therefore the operation is ambiguous.
c = 1234L + a;
-or-
c = (long)1234 + a;
+ ( long, const Fraction& )
is chosen because a trivial conversion is required for int to long.
The same selection is also made for the second argument, making the
operator
+ ( long, const Fraction& )
common to both the selections, and thus resolving the ambiguity.
/* Compile Options needed: none
*/
class Fraction {
private:
int x;
int y;
public:
Fraction(int a=0, int b=0) : x(a), y(b) { }
~Fraction(){}
operator float () {return int(x);}
};
Fraction& operator+(long i, const Fraction& ) { Fraction f ; return f; }
Fraction& operator+(const Fraction& , const Fraction& ){ Fraction f;
return f; }
Fraction& operator+(const Fraction& , long i ) { Fraction f ; return f;}
void main()
{
Fraction a(2,3), c;
c = 1234 + a; // error C2666: '+' : 4 overloads have
// similar conversion
}
Additional query words: 8.00 8.00c 9.00 9.10
Keywords: kbprb kbcpponly kbcompiler KB106392