2011-08-21 51 views
2

我有一個類記憶池具有以下的(縮短到相關)碼包含對象的模板:C++使用相同類型T

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) could not deduce template argument for '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); 
} 
+0

我遵循你寫的大部分內容,但是讓我感到困惑:首先你說問題是編譯器抱怨,因爲你沒有指定模板參數T.這是真的。然後你說你想要關於類型和int的東西,我真的不明白。你能澄清一下你期待的System :: MemoryPool(10,100)嗎? –

+1

@John,markdown吃了類型參數,我解決了這個問題。 – svick

+0

基本上我想能夠用一個類型實例化一個MemoryPool,說這個類型是int,char,不管。然後會實例化一個相同類型的複合AbstractFactory,即_factory。 – Short

回答

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

正如您所看到的,內部函數具有完全獨立的外部類模板參數。您可能只想從內部函數中刪除模板參數,因此它需要外部類的模板參數。

+0

你猜到我是如何宣佈我的課程的。你的猜測是正確的,從內部函數中刪除模板參數正是我語義上想要的。謝謝 – Short

2

因爲AbstractFactory代碼丟失,我不能肯定地說,但它似乎CreateItemAbstractFactory模板方法編譯器無法確定要調用哪個版本。

+0

我繼續向上面的代碼添加CreateItem()的定義,我希望編譯器使用MemoryPool實例化的相同類型T實例化AbstractFactory的組合對象。 – Short

1

很難說些什麼明確的,因爲你不顯示所有的代碼,但它看起來像你需要說CreateItem<T>()而不是CreateItem()。沒有(常規)參數的函數模板不能推導出它的任何模板參數。它們必須明確指定。

相關問題