2017-03-17 69 views
2

我有一個模板函數無法推斷出模板參數爲「常量」 ......從int

template<typename It> 
void Foo(It first, It second) 
{ 
    It third = first; 
    Bar(first, second, third); 
} 

當我打電話Foo與代碼調用另一個模板函數

template<typename It> 
void Bar(It first,It second,It third) 
{ 
    for(It j= first + 2; j < second; j++) 
    { 
     third++; 
    } 
} 

std::list<int> l{ 3, 8, 2, 5, 1, 4, 7, 6 }; 
Foo(l.begin(), l.end()); 

我得到幾個錯誤指的是線

for(It j= first + 2; j < second; j++) 
在富

。所述第一錯誤消息是

錯誤C2784 '的std :: reverse_iterator的< _RanIt>的std ::操作者 +(reverse_iterator的< _RanIt> :: difference_type,常量性病:: reverse_iterator的< _RanIt> &)':不能推斷模板參數 爲「常量的std :: reverse_iterator的< _RanIt> &」從 「詮釋」 AlgorithmsTests

我有什麼改變,使代碼段工作?

+0

[無法重現](http://coliru.stacked-crooked.com/a/70de46a3e4c8353f) – cpplearner

+2

你正在做點什麼。到目前爲止,您發佈的任何內容都不會帶入圖片逆向迭代器。實際上你正在做其他事情。它是什麼? – AnT

+1

請提供一個[mcve] – kennytm

回答

4

for(It j= first + 2; j < second; j++) 

不應該是一個問題,當Itstd::vector<int>::iterator。但是,這不一定適用於所有類型的迭代器。改爲使用std::advance

另外,j < second也不適用於非隨機訪問迭代器。謝謝,@ T.C。

用途:

It j = first; 
std::advance(j,2); 
for(; j != second; j++) 

另外,更優雅,選項(謝謝,@AnT):

for(It j = std::next(first, 2) ; j != second; j++) 
+0

也不會''爲非隨機訪問迭代器工作。還有'std :: next'。 –

+2

'It j = std :: next(first,2)'可以說是一個更優雅的選擇。 – AnT