// how can I access A::a?

Discussion in 'C++' started by dick, Apr 11, 2011.

  1. dick

    dick Guest

    /* multi_level_inheritance.cpp */
    struct A
    {
    int a;
    };

    struct B1 : public A
    {
    int a;
    };

    struct B2 : public A
    {
    int a;
    };

    struct C : public B1, public B2
    {
    int a;
    };

    int main()
    {
    C ccc;

    ccc.a=123;

    ccc.B1::a=456;

    /* 0030 */ ccc.B1::A::a=789;

    }

    // c++ multi_level_inheritance.cpp
    // multi_level_inheritance.cpp: In function int main():
    // multi_level_inheritance.cpp:30: error: A is an ambiguous base of C


    // how can I access A::a?
    dick, Apr 11, 2011
    #1
    1. Advertising

  2. On 12/04/2011 0.52, dick wrote:
    > struct A
    > {
    > int a;
    > };
    >
    > struct B1 : public A
    > {
    > int a;
    > };
    >
    > struct B2 : public A
    > {
    > int a;
    > };
    >
    > struct C : public B1, public B2
    > {
    > int a;
    > };


    If I go on with:

    #include <iostream>
    int main() {
    C ccc;
    ccc.a=123;
    ccc.B1::a=234;
    ccc.B2::a=345;
    ccc.B1::A::a=456;
    ccc.B2::A::a=567;
    std::cout << ccc.a << " " << ccc.B1::a << " "
    << ccc.B2::a << " " << ccc.B1::A::a << " "
    << ccc.B2::A::a;
    }

    .... and then I compile and run this program, I get as output:
    123 234 345 456 567

    What's the problem?

    --

    Carlo Milanesi
    http://carlomilanesi.wordpress.com/
    Carlo Milanesi, Apr 12, 2011
    #2
    1. Advertising

  3. dick

    dick Guest

    >
    > What's the problem?
    >


    My g++ compiler did not compile the code.


    What compiler did you use?
    dick, Apr 12, 2011
    #3
  4. On 12/04/2011 1.56, dick wrote:
    >>
    >> What's the problem?
    >>

    >
    > My g++ compiler did not compile the code.
    >
    >
    > What compiler did you use?


    I used Microsoft (R) 32-bit C/C++ Optimizing Compiler version
    15.00.30729.01 for 80x86, included with Visual Studio 2008.
    Now I just tested it also with g++ 4.3.2 for Linux and actually I got
    for 4 times the compilation error: ‘A’ is an ambiguous base of ‘C’.

    I think GCC is wrong.

    --

    Carlo Milanesi
    http://carlomilanesi.wordpress.com/
    Carlo Milanesi, Apr 12, 2011
    #4
  5. On 4/12/2011 7:38 AM, Pete Becker wrote:
    > On 2011-04-11 18:52:40 -0400, dick said:
    >
    >> /* multi_level_inheritance.cpp */
    >> struct A
    >> {
    >> int a;
    >> };
    >>
    >> struct B1 : public A
    >> {
    >> int a;
    >> };
    >>
    >> struct B2 : public A
    >> {
    >> int a;
    >> };
    >>
    >> struct C : public B1, public B2
    >> {
    >> int a;
    >> };
    >>
    >> int main()
    >> {
    >> C ccc;
    >>
    >> ccc.a=123;
    >>
    >> ccc.B1::a=456;
    >>
    >> /* 0030 */ ccc.B1::A::a=789;
    >>
    >> }
    >>
    >> // c++ multi_level_inheritance.cpp
    >> // multi_level_inheritance.cpp: In function int main():
    >> // multi_level_inheritance.cpp:30: error: A is an ambiguous base of C
    >>
    >>
    >> // how can I access A::a?

    >
    > There are two A::a's, which is why the error message said that the
    > reference to A is ambiguous. You need to decide which one you want to
    > access, then name it. Hint: there's one in B1 and one in B2.


    And does the fact that the OP specifically used 'B1::' before 'A::a'
    matter not?

    V
    --
    I do not respond to top-posted replies, please don't ask
    Victor Bazarov, Apr 12, 2011
    #5
  6. On 4/12/2011 2:20 PM, Pete Becker wrote:
    > On 2011-04-12 13:34:19 -0400, Victor Bazarov said:
    >
    >> On 4/12/2011 7:38 AM, Pete Becker wrote:
    >>> On 2011-04-11 18:52:40 -0400, dick said:
    >>>
    >>>> /* multi_level_inheritance.cpp */
    >>>> struct A
    >>>> {
    >>>> int a;
    >>>> };
    >>>>
    >>>> struct B1 : public A
    >>>> {
    >>>> int a;
    >>>> };
    >>>>
    >>>> struct B2 : public A
    >>>> {
    >>>> int a;
    >>>> };
    >>>>
    >>>> struct C : public B1, public B2
    >>>> {
    >>>> int a;
    >>>> };
    >>>>
    >>>> int main()
    >>>> {
    >>>> C ccc;
    >>>>
    >>>> ccc.a=123;
    >>>>
    >>>> ccc.B1::a=456;
    >>>>
    >>>> /* 0030 */ ccc.B1::A::a=789;
    >>>>
    >>>> }
    >>>>
    >>>> // c++ multi_level_inheritance.cpp
    >>>> // multi_level_inheritance.cpp: In function int main():
    >>>> // multi_level_inheritance.cpp:30: error: A is an ambiguous base of C
    >>>>
    >>>>
    >>>> // how can I access A::a?
    >>>
    >>> There are two A::a's, which is why the error message said that the
    >>> reference to A is ambiguous. You need to decide which one you want to
    >>> access, then name it. Hint: there's one in B1 and one in B2.

    >>
    >> And does the fact that the OP specifically used 'B1::' before 'A::a'
    >> matter not?
    >>

    >
    > Sure, but you're giving away the ending. There's clearly a problem in
    > the line ccc.a = 123; so it's not at all likely that the only error
    > message came from the line marked /* 0030 */.


    Actually, since 'C' has a member 'a', which hides *both* 'B1::a' and
    'B2::a' (which in turn hid both 'A::a' from base class 'A'), I would not
    expect to see an error in 'ccc.a = 123;'. Just saying...

    >
    > On the other hand, it does help to carefully read the code in question. :-(
    >


    V
    --
    I do not respond to top-posted replies, please don't ask
    Victor Bazarov, Apr 12, 2011
    #6
  7. dick

    Miles Bader Guest

    Carlo Milanesi <> writes:
    > I think GCC is wrong.


    Note that both clang++ (2.8) and Comeau C++'s online compiler[*] (which
    seems to be highly regarded for accurately reflecting the standard) give
    the same error as gcc...

    [*] http://www.comeaucomputing.com/tryitout

    -Miles

    --
    My books focus on timeless truths. -- Donald Knuth
    Miles Bader, Apr 13, 2011
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Doug
    Replies:
    3
    Views:
    4,342
    Bruce Barker
    Nov 4, 2005
  2. kamig
    Replies:
    1
    Views:
    457
    =?Utf-8?B?cmFq?=
    Mar 17, 2006
  3. Replies:
    7
    Views:
    310
    BartlebyScrivener
    Feb 6, 2007
  4. Hans Östlund
    Replies:
    1
    Views:
    158
    Alessandro Zifiglio
    Feb 5, 2004
  5. ThunderMusic
    Replies:
    1
    Views:
    136
    ThunderMusic
    Feb 22, 2007
Loading...

Share This Page