包含使用相同类型T的对象的c ++模板

时间:2011-08-21 03:16:02

标签: c++ templates object composite

我有一个类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 个答案:

答案 0 :(得分:3)

你已经删除了很多代码,但是猜测一下,你有类似的东西:

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>();

如您所见,内部函数具有与外部类完全独立的模板参数。您可能只想从内部函数中删除模板参数,因此它需要外部类的模板参数。

答案 1 :(得分:2)

我无法确定,因为AbstractFactory代码丢失,但出现 CreateItemAbstractFactory内的模板方法和编译器无法确定要调用的版本。

答案 2 :(得分:1)

由于您没有显示所有代码,因此很难说清楚,但看起来您需要说CreateItem<T>()而不是CreateItem()。没有(常规)参数的函数模板不能推导出任何模板参数。必须明确指定它们。