C ++ Использование указателей на шаблоны объектов - PullRequest
7 голосов
/ 24 февраля 2011

У меня есть класс с именем ABC, который имеет шаблон класса:

template <class T> class ABC{}

В другом классе я пытаюсь сохранить объекты ABC в списке:

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

Я намеренхранить объекты ABC, которые могут иметь различные параметры шаблона класса.Нужно ли указывать шаблон даже для указателя во время компиляции?Что, если контейнер должен хранить объекты другого типа?Разве это не возможно?

Ответы [ 3 ]

7 голосов
/ 24 февраля 2011

Обязательно ли указывать шаблон даже для указателя во время компиляции?

Да.

Что если контейнер должен хранить объектыдругой тип ?Разве это невозможно?

Это невозможно (напрямую).

Нет такой вещи, как класс ABC.Есть только экземпляры ABC, такие как ABC<Foo> и ABC<Bar>.Это совершенно разные классы.

Вы можете сделать что-то вроде:

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

list<ABC_Base*> some_list;

Таким образом, все ваши экземпляры ABC имеют общий базовый тип, и вы можете произвольно использовать базовый указатель.

1 голос
/ 24 февраля 2011

В списке можно хранить только один тип. Различные экземпляры шаблона - это разные типы. Если это удовлетворительно, вы можете сделать это так:

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

Если вам нужно использовать разные типы, возможно, вы могли бы создать не шаблонный базовый класс для ABC и сохранить указатели на это. (т.е. использовать интерфейс)

1 голос
/ 24 февраля 2011

Вам нужно либо указать параметры шаблона в вашем классе CDE, либо сделать CDE шаблоном.

Первый вариант:

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

Второй вариант:

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