2014-10-12 70 views
1

我試圖定義一個模板函數,它需要一個容器,它也是一個模板類型。我需要知道容器的模板類型是什麼(E)(所以我可以在代碼中引用它,例如E element = *iterator;)。這裏是我的嘗試:試圖定義一個採用模板參數的模板函數

template <template <typename E> T> 
void sort(T& container){ ... } 

我認爲這意味着「sort是一個模板函數,它接受一個模板參數TT是一個模板類型,需要一個模板參數E。」

但是我得到的錯誤:

expected 'class' before T. 

當我把 '階級' 在那裏,它說:

variable or field 'sort' declared void 

我在做什麼錯誤的語法?

+1

只需一個簡單的類型參數'T',然後使用'typename T :: value_type'。你在做什麼不能用標準容器 - 它們有多個模板參數。 – 2014-10-12 14:10:54

+3

'T'不是一種類型。你不能參考某種不屬於某種類型的東西。順便說一句,叮噹[處理這兩個錯誤很好](http://coliru.stacked-crooked.com/a/8dfca2ea54604829)。 – chris 2014-10-12 14:11:27

+1

正如克魯斯所說的,你也必須給模板「T」適當的參數。實際上,你對模板不感興趣,而是對特定的模板實例化(一個類)感興趣。 – Deduplicator 2014-10-12 14:14:39

回答

0

還有其他方法可以實現相同的功能。你需要的是一個template template參數。一個工作的例子是:

template <typename E, template <typename> class T> 
void sort(T<E>& container){} 
main(){} 

在模板簽名,T被宣佈爲一個(相關)類型的另需類型參數。該參數本身(E)需要聲明並提供給T,就像您在vector<int>中使用一樣。

您還可以使用:

template <typename E, template <typename, typename...> class T> 

如果你的容器類型預計可選參數,如特質。

相關問題