這是詹姆斯對這個問題的回答的後續:Flattening iterator如何將模板類的容器的迭代器傳遞給函數?
我試圖改變James的解決方案,以便它可以處理模板類。原來我被卡在函數的調用中(這裏「扁平化」,這裏是「foo」)。當我專門爲每個模板參數進行工作時,這是可能的,因爲只有三個(1,2,3)會發生。一般情況下不編譯。請參閱下面的代碼和gcc的錯誤消息。後
#include <iterator>
#include <vector>
template <int I>
class A{};
template <int I>
void foo(typename std::vector< A <I> >::iterator first ,
typename std::vector< A <I> >::iterator last) {}
//void foo(typename std::vector< A <1> >::iterator first ,
// typename std::vector< A <1> >::iterator last) {} // this works
int main()
{
std::vector< A<1> > v;
foo(v.begin(),v.end());
return 0;
}
錯誤信息用gcc 4.6.3編譯:
test_templ_func.cc: In function ‘int main()’:
test_templ_func.cc:15:24: error: no matching function for call to ‘foo(std::vector<A<1> >::iterator, std::vector<A<1> >::iterator)’
test_templ_func.cc:15:24: note: candidate is:
test_templ_func.cc:8:6: note: template<int I> void foo(typename std::vector<A<I> >::iterator, typename std::vector<A<I> >::iterator)
爲什麼你定義了相同的函數模板*兩次*?其中之一,你忘了使用'typename',否則其他的一切都是一樣的。 – Nawaz 2012-07-11 16:51:08
@Nawaz:對不起,cut'n'paste錯誤...感謝您發表。糾正這一點。 – steffen 2012-07-11 17:01:26
這裏要做的「通常」事情是將'foo'聲明爲'template ForwardIterator foo(ForwardIterator first,ForwardIterator last);'並且讓迭代器類型被推導出來。除非你真的需要'I'的價值。 –
2012-07-12 04:29:57