473,396 Members | 2,057 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,396 software developers and data experts.

Accessing hidden members of a class (as in x.A::B::y instead of x.y)

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).

Thanks
Jul 26 '08 #1
6 1183
On Jul 26, 2:25*pm, Rajib <raji...@verizon.netwrote:
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;

}
Because your don't need to inherit from C and B, only from C,
class E : public C, {};
x.B::b++;

If you do that, x is also a B

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).

Thanks
Jul 26 '08 #2
Darío Griffo wrote:
On Jul 26, 2:25 pm, Rajib <raji...@verizon.netwrote:
>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;

}

Because your don't need to inherit from C and B, only from C,
class E : public C, {};
x.B::b++;

If you do that, x is also a B

>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).

Thanks
Thanks for the response, but I'm not sure how that answers my question.
If I inherit from only C then looking up B as a member of C is
unambiguous; but if there are multiple instances (wrong word?) of B in
C, I'd expect to be able to specify them through their path of inheritance.

I'm more interested in how the compiler should resolve this than
actually writing such code.
Jul 26 '08 #3
On Jul 26, 7:25 pm, Rajib <raji...@verizon.netwrote:
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), but accepts x.C::b++. 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++.

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).

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Jul 27 '08 #4
In article <V5Jik.95$rb5.46@trnddc04>, Rajib <ra*****@verizon.netwrote:
class B {
public: int b;
};

class C : public B {};

class E : public C, public B {};

...
x.C::B::b++; //test3.cpp:14: error: ‘B’ is an ambiguous base of ‘E’
...

Why is this ambiguous?
C::B names the type B, thus I'd expect x.C::B::b to be equivalent to
x.B::b, that is, ambiguous. The B comes from the implicit "typedef B B"
that's inside B, and inherited by C.
Jul 27 '08 #5
James Kanze wrote:
On Jul 26, 7:25 pm, Rajib <raji...@verizon.netwrote:
>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), but accepts x.C::b++. 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++.
Alright, so I guess the correct way to interpret
A x;
y.B::C::D::E::F::G::x;

is to make sure C is (unambiguously?) found in the class hierarchy of B,
D is (unambiguously?) found in the class hierarchy of C, etc... and then
throw all of that information away and just lookup G in A? The draft
standard says in 10.2 [class.member.lookup] that

"For an id-expression, name lookup begins in the class scope of this;
for a qualified-id, name lookup begins in the scope of the
nested-name-specifier."

Which seems to agree that g++/Comeau are correct (no surprise).

C++ makes less sense to me every day.

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).
Heh, I've never had to even use a qualified member lookup in actual
code; this is just test code for the program-resembling-a-compiler that
I'm writing.

Thanks all,
Rajib
Jul 27 '08 #6
On Jul 27, 1:07 pm, "Alf P. Steinbach" <al...@start.nowrote:
* James Kanze:
On Jul 26, 7:25 pm, Rajib <raji...@verizon.netwrote:
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.
Well, I won't argue about it. Mainly because I can't really
figure out what the standard is trying to say myself. And
because I don't consider it important, since such cases
shouldn't ever really occur in reasonable code. (Of course, if
you're writing a compiler, that's a different issue.)

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Jul 27 '08 #7

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Gianni Mariani | last post by:
I was a little surprised by this: It seems like the code below should not compile but the Comeau 4.3.3 compiler accepts it and the gcc 3.4(prerel) compiler rejects it and MSVC++7.1 ICE's. ...
3
by: Joe | last post by:
Hello All: I have two webforms (WebForm1.aspx and WebForm2.aspx) that inherit from BasePage.aspx. BasePage.aspx inherits System.Web.UI.Page and has one hidden field (hdnSessionId) that I want...
6
by: earthwormgaz | last post by:
Is the following legal? class Outer { class Inner { private: Inner() { } };
12
by: Robert Fuchs | last post by:
Hello, This example: public class BaseC { public int x; public void Invoke() {} } public class DerivedC : BaseC
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.