Strange behavior with templates and G++

2011-02-17 Thread Pascal Francq
Hi,
While compiling the following code, I got an error :


template 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, public Super
{
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::Test(C*) [with C = A2]
error:  void Super::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::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++ ?

Thanks.
-- 

Dr. Ir. Pascal Francq
BELGIUM


signature.asc
Description: This is a digitally signed message part.


Re: Strange behavior with templates and G++

2011-02-17 Thread Pascal Francq
In fact, since it is related on how g++ is implementing its heritage mechanism 
in C++, I was thinking it was the right mailing-list. In fact, by adding a 
convenient method in Super2, the code compiles :
template inline void Test(C* ptr) {Super::Test(ptr);}
This trick let me suppose that a problem may exist in the way g++ links a call 
to the corresponding method when it handles template classes.

On jeudi 17 février 2011, Jonathan Wakely wrote:
> On 17 February 2011 11:03, Pascal Francq wrote:
> > Is this a problem related to a misunderstood concept from me, a wrong
> > implementation or a technical problem of g++ ?
> 
> In any of those cases, such questions are off-topic on this mailing
> list, which is for development of gcc, not help using it.  Please see
> http://gcc.gnu.org/lists.html and ask the question on the gcc-help
> list, thanks.
> 
> I believe G++ is correct in this case.


-- 

Dr. Ir. Pascal Francq
BELGIUM


signature.asc
Description: This is a digitally signed message part.