我有一个类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);
}
答案 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
代码丢失,但出现 CreateItem
是AbstractFactory
内的模板方法和编译器无法确定要调用的版本。
答案 2 :(得分:1)
由于您没有显示所有代码,因此很难说清楚,但看起来您需要说CreateItem<T>()
而不是CreateItem()
。没有(常规)参数的函数模板不能推导出任何模板参数。必须明确指定它们。