Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ Using pointers to template objects

I have a class named ABC which has a class template:

template <class T> class ABC{}

In another class I am trying to store of objects ABC in a list:

class CDE{
private:
  list<ABC *> some_list; 
}

I intend to store objects of ABC which might have different class template parameters. Is it necessary to specify template even for a pointer at compile time? What if the container is supposed to store objects of different type? Is that not possible?

like image 766
cyrux Avatar asked Feb 23 '11 23:02

cyrux


3 Answers

Is it necessary to specify template even for a pointer at compile time ?

Yes.

What if the container is supposed to store objects of different type ? Is that not possible ?

It is not (directly) possible.

There is no such thing as the class ABC. There are only instantiations of ABC, such as ABC<Foo> and ABC<Bar>. These are completely different classes.

You can do something like:

template<typename T>
class ABC : public ABC_Base
{
  ...
}

list<ABC_Base*> some_list;

By doing this, all of your ABC instantiations have a common base type, and you can use a base pointer arbitrarily.

like image 66
Tim Avatar answered Sep 29 '22 12:09

Tim


You need to either specify the template parameters in your CDE class, or make CDE a template as well.

First option:

class CDE {
private:
    list< ABC<int>* > some_list;
};

Second option:

template <class T>
class CDE {
private:
    list< ABC<T>* > some_list;
};
like image 44
user470379 Avatar answered Sep 29 '22 14:09

user470379


The list can only store a single type. Different instantiations of a template are different types. If this is satisfactory, you can do it like this:

template <class T> class CDE{ private: list<ABC<T> *> some_list; }

If you need to use different types, perhaps you could create a non-template base class for ABC and store pointers to that. (ie. use an interface)

like image 27
Alex Deem Avatar answered Sep 29 '22 12:09

Alex Deem