Шаблон C ++, содержащий объект, использующий тот же тип T - PullRequest
2 голосов
/ 21 августа 2011

У меня есть класс MemoryPool со следующим (сокращенным до релевантного) кодом:

namespace System
{
    template <class T>
    class MemoryPool
    {
    public:
        // only constructor
        MemoryPool(const size_t itemsToInitNow, const size_t maxItems)
            : _maxItemsInMemoryPool(maxItems)
        {
            // initialize itemsToInitNow items immediately
            for(size_t i = 0; i < itemsToInitNow; ++i) {
                _container.push_back(MemoryItemSharedPointer(new MemoryItem<T>(_factory.CreateItem())));
            }
        }
            .. other stuff

    private:
            .. other stuff
        // private data members
        AbstractFactory<T> _factory;

Когда я создаю экземпляр объекта в другом месте моего кода, например

new System::MemoryPool<ParticleShape>(10, 100);

Я получаю следующую ошибку компиляции:

System::AbstractFactory<T>::CreateItem(void) не удалось вывести аргумент шаблона для 'T'.

Мой класс AbstractFactory также является классом шаблона, я определил_factory как частный составной объект MemoryPool с типом T. Мне бы хотелось, чтобы всякий раз, когда я создавал экземпляр объекта MemoryPool с типом, скажем, MemoryPool целых чисел, он инициализировал составной _factory с типом int.Есть ли способ сделать это?

Редактировать: вот метод CreateItem, в зачаточном состоянии:

 template <typename T>
 inline const std::shared_ptr<T> CreateItem()
 {
      return std::shared_ptr<T>(new T);
 }

Ответы [ 3 ]

3 голосов
/ 21 августа 2011

Вы вырезали много своего кода, но, по-видимому, у вас есть что-то вроде этого:

template<typename T>
class AbstractFactory {
// ......
    template <typename T>
    inline const std::shared_ptr<T> CreateItem()
    {
        return std::shared_ptr<T>(new T);
    }
};

Внутренний шаблон скрывает внешнее значение T - чтобы вызвать это,вам нужно будет сделать что-то вроде:

AbstractFactory<Anything> factory;
std::shared_ptr<int> pInt = factory.CreateItem<int>();

Как видите, внутренняя функция имеет полностью независимый параметр шаблона от внешнего класса.Вы, вероятно, захотите просто удалить параметр шаблона из внутренней функции, поэтому он принимает параметр шаблона внешнего класса.

2 голосов
/ 21 августа 2011

Не могу сказать наверняка, поскольку код AbstractFactory отсутствует, но кажется , что CreateItem - это метод шаблона в AbstractFactory, и компилятор не может определить, какая версия позвонить.

1 голос
/ 21 августа 2011

Трудно сказать что-то определенное, поскольку вы не показываете все код, но похоже, что вам нужно сказать CreateItem<T>() вместо CreateItem().Шаблон функции, который не имеет (обычных) аргументов, не может вывести ни один из своих аргументов шаблона.Они должны быть указаны явно.

...