This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: multiple inheritance abiguity



On Jan 19, 2006, at 4:46 AM, Dima Sorkin wrote:


On 18 Jan 2006 21:22:11 -0600, Gabriel Dos Reis wrote:
The program is indeed in error. There are two kinds of ambiguity:
 (1) name lookup ambiguity
 (2) call ambiguity.

Since overload resolution takes place only after name lookup, you
can't expect overload resolution to pick C1::f, when you're already in
trouble with (1).

I can add that you can read further about it in B. Stroustrup "The C++ Programming Language". Exactly this case is explained there.


Thanks folks. I'll look again--specifically for "name ambiguity" this time. (I have the 3rd edition)


I think that what you're telling me is that the name resolution algorithm uses _only_ the method's name (not its signature) to first select a namespace, and that since an "f(...)" exists in both "M::C1" and "M::C2", the compiler is unable to select between them. Furthermore this is the algorithm as defined by the language.

What strikes me as odd is that both resolutions phases appear to rely on only partial information. Name resolution doesn't appear to consider signatures and overload resolution doesn't appear to consider fully qualified names.

I would've expected one of two other algorithms:
1) Name lookup produces, not a namespace, but a fully qualified name. IOW, given "M" and "f(...)" the name lookup reports two candidates, "M::C1::f(....)" and "M::C2::f(...)". Then overload ambiguity selects between the two--which are "f(C1*, int)" and "f (C2*, double)" when we consider the hidden first arg. Since M is a C2 we'd settle on M::C2::f(double).
2) Alternately, if the name lookup is to report a namespace, I'd expect it to be driven by the method's signature. IOW given "M" and "f(double)" the name lookup reports a single candidate, "M::C2". Considering the hidden first arg, the signature "f(M*, double)" should match C2's "f(C2*, double)" since M is a C2.



--rich



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]