Re: Accessing hidden members of a class (as in x.A::B::y instead
of x.y)
* James Kanze:
On Jul 26, 7:25 pm, Rajib <raji...@verizon.net> wrote:
If I have the following code
class B {
public: int b;
};
class C : public B {};
class E : public C, public B {};
int main() {
E x;
C y;
x.C::B::b++; //test3.cpp:14: error: ?B? is an ambiguous base of ?E?
y.b++;
y.B::b++;
return 0;
}
Why is this ambiguous? I thought the compiler would look up C
(and find it unambiguously) and then use that to look up C::B
(again finding it unambiguously).
So did I, and my first reaction is to say that you'd encountered
a compiler error. In the expression x.C::B::b++, B and b should
be looked up using qualified name lookup, which finds the B in
C, and the b in B. VC++ accepts this, and I seem to recall
other compilers in the past accepting it as well (but it is a
very distant past, so I'm not really sure). G++ complains as
written (which I think is an error),
No, it's probably correct; see my reply else-thread.
Comeau C/C++ 4.3.10.1 (May 29 2008 09:37:15) for ONLINE_EVALUATION_BETA1
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ C++0x_extensions
"ComeauTest.c", line 12: error: base class "B" is ambiguous
x.C::B::b++; //test3.cpp:14: error: ?B? is an ambiguous base of ?E?
^
but accepts x.C::b++.
This seems to be correct.
I
think that the consecrated solution here would be to cast this
to the target type: "static_cast< B* >( static_cast< C* >( &x )
)->b++" also works with g++.
See my reply else-thread.
Regardless, you don't want a hierarchy like this, since there is
no way to unambiguously refer to the B direct base of E (and
both g++ and VC++ warn about this).
Right, I forgot to mention that! :-)
Cheers,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?