[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.c++

Templates and inheritance

Isaac Gelado

10/16/2008 2:36:00 PM

Hi,
I am having problems with inheritance in templates classes. Say I
have the following classes:

class A {};
class B: public A {};
template<typename T> class C {};

Now in my code I have something like:

C<A *> *myAPtr;
myAPtr = new C<B *>();

I'm getting an error saying that conversion from C<B *> to C<A *> is
not possible. Does it mean I can no use subclassing with templates
without using ugly casts?

Thanks,
Isaac
2 Answers

Maxim Yegorushkin

10/16/2008 3:04:00 PM

0

On Oct 16, 3:35 pm, Isaac Gelado <igel...@gmail.com> wrote:

>  I am having problems with inheritance in templates classes. Say I
> have the following classes:
>
> class A {};
> class B: public A {};
> template<typename T> class C {};
>
> Now in my code I have something like:
>
> C<A *> *myAPtr;
> myAPtr = new C<B *>();
>
> I'm getting an error saying that conversion from C<B *> to C<A *> is
> not possible.

The actual error is that C<B*>* can not be converted to C<A*>*.

This is expected, as each instantiation of a class template produces a
distinct class, unless template arguments are the same.

> Does it mean I can no use subclassing with templates
> without using ugly casts?

To make derived-to-base conversion from C<B>* from C<A>* work C<B> has
to derive from C<A>.

If, on the other hand, you just want to make a conversion from C<B> to
C<A> possible, you need to have a template conversion constructor,
just like the standard smart-pointers do (std and boost):


template<class T> struct C
{
template<class U>
C(C<U> const&);
};

--
Max

James Kanze

10/17/2008 7:38:00 AM

0

On Oct 16, 4:35 pm, Isaac Gelado <igel...@gmail.com> wrote:

> I am having problems with inheritance in templates classes.
> Say I have the following classes:

> class A {};
> class B: public A {};
> template<typename T> class C {};

> Now in my code I have something like:

> C<A *> *myAPtr;
> myAPtr = new C<B *>();

> I'm getting an error saying that conversion from C<B *> to C<A *> is
> not possible.

Normal. C<B*> and C<A*> are two completely unrelated classes.

> Does it mean I can no use subclassing with templates without
> using ugly casts?

Sure you can, but you're not deriving anything in the templates
here. Derivation in template classes works exactly like
derivation for any other class, and given:

class Toto
{
// ...
A* pA ;
} ;

class Titi
{
// ...
B* pB ;
} ;

there's no implicit conversion (nor should there be) Titi* to
Toto*. If you replace Toto with C<A*> and Titi with C<B*>, why
would you expect anything different?

--
James Kanze (GABI Software) email:james.kanze@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