public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jonathan Wakely <jwakely.gcc@gmail.com>
To: gcc-help@gcc.gnu.org
Cc: Axel Freyn <axel-freyn@gmx.de>
Subject: Re: Strange behavior with templates and G++
Date: Thu, 17 Feb 2011 16:30:00 -0000	[thread overview]
Message-ID: <AANLkTinRGTtGmm_Vok=1Cnit58G4tb4wPFjFpDTXfpTX@mail.gmail.com> (raw)
In-Reply-To: <20110217131616.GU5274@axel>

On 17 February 2011 13:16, Axel Freyn wrote:
> On Thu, Feb 17, 2011 at 12:22:53PM +0000, Jonathan Wakely wrote:
>> [Moved from the gcc list]
>>
>> On 17 February 2011 11:03, Pascal Francq wrote:
>> > Hi,
>> > While compiling the following code, I got an error :
>> >
>> >
>> > template<class C> class Super
>> > {
>> > public:
>> >        Super(void) {}
>> >        void Test(C*) {}
>> > };
>> >
>> > class A
>> > {
>> > public:
>> >        A(void) {}
>> > };
>> >
>> > class A1 : public A
>> > {
>> > public:
>> >        A1(void) : A() {}
>> > };
>> >
>> > class A2 : public A
>> > {
>> > public:
>> >        A2(void) : A() {}
>> > };
>> >
>> > class Super2 : public Super<A1>, public Super<A2>
>> > {
>> > public:
>> >        Super2(void) {}
>> > };
>> >
>> > void Test(void)
>> > {
>> >        Super2 T;
>> >        A1* ptr;
>> >        T.Test(ptr);
>> > }
>> >
>> >
>> > The compiler gives me the following error for the Test() function:
>> >        error: request for member ‘Test’ is ambiguous
>> >        error: candidates are:  void Super<C>::Test(C*) [with C = A2]
>> >        error:                          void Super<C>::Test(C*) [with C = A1]
>> > But here the call refers clearly to the second method. The error still appears
>> > if A1 and A2 do not inherit from a same root class. If I replace the code with
>> > an explicit call it works:
>> >        T.Super<A1>::Test(ptr)
>> > But this make the code less cleaner.
>> >
>> > Is this a problem related to a misunderstood concept from me, a wrong
>> > implementation or a technical problem of g++ ?
>>
>>
>> The ambiguity has nothing to do with templates, the code can be reduced to:
>>
>> class A1
>> {
>> public:
>>        void Test(A1*) {}
>> };
>>
>> class A2
>> {
>> public:
>>        void Test(A2*) {}
>> };
>>
>> class Super2 : public A1, public A2
>> {
>> };
>>
>> void Test(void)
>> {
>>        Super2 T;
>>        A1* ptr;
>>        T.Test(ptr);
>> }
>>
>> This is covered by 10.2 [class.member.lookup] in the C++ standard,
>> which says that a name is ambiguous if found in more than one base
>> class.  That makes the lookup ill-formed, before overload resolution
>> is attempted.
>
> In addition: it is not necessary to use everywhere an explicit call.
> You can import the function by adding "using"-definitions. With:
> class Super2 : public A1, public A2
> {
>  public:
>    using A1::Test;
>    using A2::Test;
> };
> you can call T.Test(ptr) directly, and C++ will do correct overload
> resolution -- both with and without templates

Right, in that case name lookup finds two overloads of "Test" without
looking in any base classes, then overload resolution selects the
right one.

      reply	other threads:[~2011-02-17 14:08 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <201102171203.53710.pascal@francq.info>
2011-02-17 13:09 ` Jonathan Wakely
2011-02-17 14:05   ` Axel Freyn
2011-02-17 16:30     ` Jonathan Wakely [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='AANLkTinRGTtGmm_Vok=1Cnit58G4tb4wPFjFpDTXfpTX@mail.gmail.com' \
    --to=jwakely.gcc@gmail.com \
    --cc=axel-freyn@gmx.de \
    --cc=gcc-help@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).