2017-03-17 10 views
2

int型から私は、コードは「CONST」のテンプレート引数を推定できませんでした...

Fooを呼び出すと

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

別のテンプレート関数を呼び出すテンプレート機能

template<typename It> 
void Foo(It first, It second) 
{ 
    It third = first; 
    Bar(first, second, 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++) 

Fooにあります。最初のエラーメッセージが

エラーC2784 'のstd :: reverse_iterator < _RanIt>のstd ::演算子 +(reverse_iterator < _RanIt> :: difference_type、constのはstd :: reverse_iterator < _RanIt> &)' です:できませんでした用テンプレート引数 を推測 'のconstのstd :: reverse_iterator < _RanIt> &' から「int型AlgorithmsTests

私はコードスニペットを動作させるために変更する必要がありますか?

+0

(http://coliru.stacked-crooked.com/a/70de46a3e4c8353f) – cpplearner

+2

あなたは何かを作っています。あなたが今まで投稿したものは、逆のイテレータの絵をもたらすものではありません。実際にはあなたは何か他のことをやっています。それは何ですか? – AnT

+1

[mcve] – kennytm

答えて

4

Itstd::vector<int>::iteratorとき

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

が問題になることはありませんライン。ただし、必ずしもすべての型のイテレータで機能するとは限りません。代わりに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

関連する問題