那么,以解决这个小例子问题。这很简单。 vector<int>
是一个类,所以,你不需要在原型中声明A<B>
。你可以这样做:
template<class A>
void myFunction(A& list)
{
typedef typename A::value_type B; //do this if you need to know the type of the elements.
typename A::iterator current = list.begin();
typename A::iterator end = list.end();
while (current != end)
{
current++;
}
}
但如果你真的需要,你也可以声明模板参数作为模板太:
template< template<class> class A, class B >
void myFunction(A<B>& list)
{
typename A<B>::iterator current = list.begin();
typename A<B>::iterator end = list.end();
while (current != end)
{
current++;
}
}
但上面的并不推荐使用,最类模板有一组嵌套类型定义(如STL容器中的iterator和value_type),以便您可以访问所需的所有类型信息,而无需使用这些模板模板参数。所以,第一种方法通常是更好的方法,也是更常用的方式(它通常使麻烦变得更简单,即编译器倾向于“不喜欢”模板模板参数)。
此外,您不能很容易与模板的模板参数使用STL容器,因为STL容器都有这些“隐藏”的模板参数(例如,“分配”和“比较”的有序容器)。所以,你必须列出所有这些,否则编译器将无法进行匹配。然后,你将不会有一个非常“通用”的功能,因为你将不得不假设已经过去的STL容器,它只能提供一种或两种类型的容器。使用第一种方法真的更好。
+1,因为它是解决这一问题的最简单的解决方案。模板模板参数很快就会变得混乱,因为它们需要参数匹配。 – 2011-02-27 19:58:34