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> 

如果你的容器类型预计可选参数,如特质。