Path: utzoo!attcan!uunet!know!sdd.hp.com!usc!bbn.com!rochester!kodak!islsun!cok From: cok@islsun.Kodak.COM (David Cok) Newsgroups: comp.lang.c++ Subject: supposedly ambiguous conversion Message-ID: <1990Oct24.165544.1835@kodak.kodak.com> Date: 24 Oct 90 16:55:44 GMT Sender: news@kodak.kodak.com Organization: Eastman Kodak Co., Rochester, NY Lines: 89 Consider this program, which gives compilation errors. It is boiled out of a larger more useful context. class Byte; class Int; class Float; class Double { public: double v; Double(); Double(const Double&); Double(Byte); Double(Int); Double(Float); friend Double operator + (Double a, Double b); }; class Float { public: float v; Float(); Float(const Float&); Float(Int); Float(Byte); friend Float operator + (Float a, Float b); }; class Int { public: int v; Int(); Int(const Int&); Int(Byte); friend Int operator + (Int a, Int b); }; class Byte { public: unsigned char v; Byte(); Byte(const Byte&); friend Byte operator + (Byte a, Byte b); }; main() { Byte b; Int i; b+i; } Sun C++ 2.0 on a SparcStation 1 says the following: CC ambiguity.c: "ambiguity.c", line 64: error: ambiguous argument for operator +(): void (Double , Double ) and void (Float , Float ) "ambiguity.c", line 64: warning: result of + expression not used 1 error (Line 64 is the b+i expression.) The warning is obvious, but I do not understand the error. Why won't the compiler choose to convert variable b to Int and then use the operator+ for Ints? The second argument is an exact match for an Int. If I replace the constructors (like Double::Double(Byte);) with operators (like Byte::operator(Double)), the problem is the same. Will anyone give me some advice? Please respond via e-mail (and to the net if you wish, of course). David R. Cok, Eastman Kodak Company, 716-477-7086 e-mail: cok@Kodak.COM