2016-05-31 4 views
0

저는 항상 C++ 템플릿을 inscrutable하고 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 

이 볼만 다음 코드에서 유래 :

#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 범위 기반 루프를 사용하는 경우 벡터 반복 아무 문제가 없습니다. 나는 iterators를 사용하여 그것을하는 법을 배우고 싶다.

누군가가 오류의 의미와 해결 방법을 설명 할 수 있습니까?

템플릿을 잘 설명하는 책을 추천받을 수 있다면 좋을 것입니다.

+1

을()'와'종료()'. 사소한 오타로 끝내기 위해 투표. – juanchopanza

+0

템플릿 코드를 작성할 때, 하나의 구체적인 경우에 템플릿이 아닌 첫 번째 템플릿을 작성하는 것이 좋습니다 (항상 그런 것은 아닙니다). 그런 다음 복사하여 붙여넣고 템플릿으로 만듭니다. – Yakk

답변

3

오류 메시지를주의 깊게보십시오. 함수를 반복자로 변환하려고합니다. ()을 추가하여 전화해야합니다.

변경

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는 함수입니다

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++) { 
//            ^^    ^^ 
    cout << *iter << endl; 
} 

또한,이 비 const 하나에 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

관련 문제