【问题标题】:c++ template containing object using same type Tc ++模板包含使用相同类型T的对象
【发布时间】:2011-10-31 10:55:23
【问题描述】:

我有一个类 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&lt;T&gt;::CreateItem(void) 无法推导出 'T' 的模板参数。

我的 AbstractFactory 类也是一个模板类,我将 _factory 定义为类型为 T 的 MemoryPool 的私有复合对象。我希望这样,每当我用一个类型实例化 MemoryPool 的对象时,比如整数的 MemoryPool,它都会初始化int 类型的复合 _factory。

有没有办法做到这一点?

编辑:这里是 CreateItem 方法,处于起步阶段:

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

【问题讨论】:

  • 我遵循了你写的大部分内容,但这让我感到困惑:首先你说问题是编译器抱怨,因为你没有指定模板参数 T。这是真的。然后你说你想要一些关于类型和 int 的东西,我真的不明白。您能澄清一下您希望System::MemoryPool(10, 100) 做什么吗?
  • @John,markdown 吃了类型参数,我解决了这个问题。
  • 基本上我希望能够用一个类型实例化一个 MemoryPool,比如该类型是 int、char 等等。然后将实例化相同类型的复合 AbstractFactory,即 _factory。

标签: c++ templates object composite


【解决方案1】:

你已经删掉了很多代码,但猜测一下,你有这样的东西:

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】:

我不能肯定地说,因为缺少 AbstractFactory 代码,但它似乎 CreateItemAbstractFactory 中的模板方法,编译器无法确定哪个要调用的版本。

【讨论】:

  • 我继续在上面的代码中添加了 CreateItem() 的定义,我希望编译器使用与 MemoryPool 实例化相同的类型 T 实例化 AbstractFactory 的复合对象。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多