2012-07-11 81 views
4

這是詹姆斯對這個問題的回答的後續: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) 
+1

爲什麼你定義了相同的函數模板*兩次*?其中之一,你忘了使用'typename',否則其他的一切都是一樣的。 – Nawaz 2012-07-11 16:51:08

+0

@Nawaz:對不起,cut'n'paste錯誤...感謝您發表。糾正這一點。 – steffen 2012-07-11 17:01:26

+1

這裏要做的「通常」事情是將'foo'聲明爲'template ForwardIterator foo(ForwardIterator first,ForwardIterator last);'並且讓迭代器類型被推導出來。除非你真的需要'I'的價值。 – 2012-07-12 04:29:57

回答

1

模板參數推導適用於許多情況下,但有限制它能做什麼。你已經達到了其中一個極限。

Stephan Lavavej(目前在微軟的STL上工作)只做了一個nice little video about template argument deduction。雖然他沒有明確地談論你的例子,但他確實涵蓋了一些類似的情況,並提供了模板參數推演可以做的一個很好的概述。

相關問題