2009-07-23 74 views
0

模板代碼是這樣的:如何使此模板代碼有效?

template <class type1> 
struct DefaultInstanceCreator { 
    type1 * operator()() { 
     return new type1; 
    } 
}; 

template < class type1 
, class InstanceCreator = DefaultInstanceCreator<type1> > 
class objectCache 
{ 
    public: 
     objectCache (InstanceCreator & instCreator) 
      :instCreator_ (instCreator) {} 
     type1* Get() { 
      type1 * temp = instCreator_(); 
     } 
    private: 
     InstanceCreator instCreator_; 
}; 

與對象類的代碼工作做好這樣的:

class A{ 
public: 
    A(int num){ 
     number = num; 
    } 
    int number; 
    struct CreateInstance { 
     CreateInstance (int value) : value_ (value) {} 
     A * operator()() const{ 
      return new A(value_); 
     } 
     int value_; 
    }; 
}; 
objectCache< A, A::CreateInstance > intcache(A::CreateInstance(2)); 
    A* temp = intcache.Get(); 
    cout << temp->number <<endl; 

當我試圖此模板如int,字符串類型...

objectCache<int> intcache(); 
int* temp = intcache.Get(); 
*temp = 3; 
cout <<temp <<endl; 

我得到è左「‘不用彷徨’必須有類/結構/聯合」, 我不能找出問題出在哪裏

當我改變到

objectCache<int> intcache; 

我得到 「 'objectCache':沒有可用的適當的默認構造函數」

使用

objectCache<int> intcache(DefaultInstanceCreator<int>()); 

我被甩「 '不用彷徨' 中必須有類/結構/聯合「。

+0

將objectCache(){}添加到objectCache類使其與objectCache一起使用< int > intcache; 現在我更瞭解模板感謝大家的回答。 – 2009-07-23 10:31:03

回答

7

在這裏,你是不是傳遞參數給intcache構造:

objectCache<int> intcache(); 
int* temp = intcache.Get(); 

這使得第一線恢復到著名的C "most vexing parse" ++,在短,您聲明intcache是一個不帶參數並返回objectCache<int>的函數。

也許你的意思是這樣的:

objectCache<int> intcache; 

,不過也許你想傳遞一個工廠:

objectCache<int> intcache((DefaultInstanceCreator<int>())); 
+0

在最後一行中,您忘記了構造函數參數的括號。我解決了這個問題(奇怪 - 提問者也在他的問題中提到了這條線,並想知道由此產生的錯誤 - 他爲什麼不問你?)。我也想提一下'objectCache'的構造函數需要被改爲不被非const引用接受,所以它可以接受臨時的。 – 2009-07-24 01:02:22

1

你聲明的是一個函數,而不是一個變量。試試這個:

objectCache<int> intcache; 
1

創建objectCache的目標似乎是錯誤的。它應該是:

objectCache<int> intcache;