2014-04-21 119 views
0

我有兩個類,DynamicCollectionDictionaryDictionary繼承自DynamicCollection並且這兩個類都是模板。外觀像這樣:模板類依賴項問題

template <typename ValueType> 
class DynamicCollection; 

template <typename KeyType, typename ValueType> 
class Dictionary : public DynamicCollection<KeyValuePair<KeyType, ValueType>>; 

我遇到的問題是,DynamicCollection需要有一種方法GroupBy,其申報如下:

template <typename Selector> 
Dictionary<Selector, ICollection<ValueType>*>* GroupBy(std::function<Selector(ValueType)> evaluator); 

所以我遇到的問題是循環依賴,我不知道如何重寫這個,所以它的工作原理。我已經嘗試着在DynamicCollection頭聲明Dictionary,然後定義在Dictionary頭的方法,但後來我來到這個奇怪的情況:

template <typename Selector> 
Dictionary<Selector, ICollection<ValueType>*>* DynamicCollection::GroupBy(std::function<Selector(ValueType)> evaluator); 

但是,正如你可以猜測,DynamicCollection需要一個模板參數列表以及函數對象的ValueType(以及返回中的ICollection)需要爲DynamicCollection聲明中的ValueType。所以,這顯然是錯誤的代碼,但我覺得它會是這樣的(如果我有在Dictionary頭將它定義):

template <typename ValueType> 
template <typename Selector> 
Dictionary<Selector, ICollection<ValueType>*>* DynamicCollection<ValueType>::GroupBy(std::function<Selector(ValueType)> evaluator); 

因爲當我把它定義是這樣的:

template <typename ValueType, typename Selector> 
Dictionary<Selector, ICollection<ValueType>*>* DynamicCollection<ValueType>::GroupBy(std::function<Selector(ValueType)> evaluator); 

我得到一個錯誤說,它不能找到匹配的聲明(其中排序對我來說很有意義)。

所以我的問題是:如何正確聲明和定義此方法

+0

您是否嘗試根據需要向前聲明模板類? –

回答

1

從語言角度,你可以通過聲明Dictionary模板編譯你定義DynamicCollection類型之前,然後定義Dictionary定義DynamicCollection<ValueType>::GroupBy

如此說來之前,雖然你可以把它編譯,你仍然有循環依賴性,並且在設計上通常是氣味。有不同的技術可以去除循環依賴,最常見的方法是拆分更多的組件,並將部分代碼移動到更高/更低的級別。在這種特殊情況下,你可能要考慮讓GroupByDynamicCollection門外的免費功能或效用,這樣的依賴關係會變成:

GroupBy -- free function or component 
     v 
    Dictionary 
     v 
DynamicCollection 

不具有設計,甚至問題的完整視圖解決很難說這是否是最好的解決方案,但總的方法應該不管。

0

很奇怪的是,下面的代碼解決了我的問題。我轉發在DynamicCollection標題中聲明Dictionary,並按照我通常的方式在類中聲明該方法。然後我使用下面的聲明和事情工作來定義Dictionary頭中的方法。在一行上的兩個模板聲明。我想知道爲什麼/如何運作。

template <typename ValueType> template <typename Selector> 
Dictionary<Selector, ICollection<ValueType>*>* DynamicCollection<ValueType>::GroupBy(std::function<Selector(ValueType)> evaluator)