2017-03-17 67 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