那麼,以解決這個小例子問題。這很簡單。 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