2016-05-31 9 views
0

私はいつもC++のテンプレートを理解できませんでしたし、C++のエラーメッセージはもっとそうです。私はいつも混乱していると感じるのではなく、理解したい。ここでは、最新の奇妙な経験です:一般的なベクトルを反復する方法

error: conversion from ‘<unresolved overloaded function type>’ to non-scalar type ‘std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}’ requested 

このdoozyは、次のコードから来ている:

#include <iostream> 
#include <vector> 

using namespace std; 

template <typename T> 
void printVector(const vector<T>& v) { 
    for (typename vector<T>::iterator iter = v.begin; iter != v.end; iter++) { 
     cout << *iter << endl; 
    } 
} 

int main() { 
    vector<int> v{1, 2, 3}; 
    printVector(v); 
    return 0; 
} 

私はC++ 11の範囲ベースのループを使用する場合には、ベクトルを反復処理問題はありません。イテレータを使ってそれを行う方法を学びたい。

誰かがエラーの意味と解決方法を説明できますか?

テンプレートをよく説明した本の推薦を得ることもできれば、素晴らしいこともあります。

+1

。簡単なタイプミスとして閉じる投票。 – juanchopanza

+0

テンプレートコードを書くときは、1つの具体的なケースのために最初のテンプレートではないことがよくあります(必ずしもそうとは限りません)。それをコピーして貼り付け、テンプレートにします。 – Yakk

答えて

3

エラーメッセージを慎重に参照してください。関数をイテレータに変換しようとしています。 ()を追加して呼び出す必要があります。

変更

C++の本のために
for (typename vector<T>::iterator iter = v.begin(); iter != v.end(); iter++) { 
               ~~    ~~ 

for (typename vector<T>::iterator iter = v.begin; iter != v.end; iter++) { 

The Definitive C++ Book Guide and List

0

std::vector<T>::begin::endが機能しています。あなたはそれらを呼び出す必要があります:

for (typename vector<T>::iterator iter = v.begin(); iter != v.end(); iter++) { 
//            ^^    ^^ 
    cout << *iter << endl; 
} 

また、あなたは非const 1にconstイテレータを変換しようとしています。 vector<T>::const_iterator、またはより良い意味ではautoを使用する必要があります。

+0

downvoteの理由は何ですか? – TartanLlama

1

beginendのカッコがありません。ベクターをconst参照で渡しているので、const_iteratorが必要です。より良い

template <typename T> 
void printVector(const vector<T>& v) { 
    for (typename vector<T>::const_iterator iter = v.begin(); iter != v.end(); iter++) { 
          ^^^^^^^^^^^^^^    ^^    ^^ 
     cout << *iter << endl; 
    } 
} 

まだのためにあったベースを使用:あなたが始まる() `と`エンド() ``必要

template <typename T> 
void printVector(const vector<T>& v) { 
    for(auto &&e : v) { 
     cout << e << endl; 
    } 
} 
+0

'auto && e 'を' auto e'に使用する利点は何ですか? –

+1

@MichaelAndersonプロキシに便利です(例えば、 'std :: vector ')。 – 101010

+1

@MichaelAnderson http://stackoverflow.com/a/13130795/2352671 – 101010

関連する問題