2016-06-10 3 views
1

벡터 요소를 반복하기 위해 "for 루프"에 대해 C++ 11을 사용하려고하지만 일부 오류 (begin() 및 end() 함수가 발생합니다)가 발생합니다. 감사합니다.STL 벡터 : 요소 반복

#include <iostream> 
#include <vector> 
#include<iterator> 
using namespace std; 
template<typename TElement> 
class MyClass { 
private: 
    vector<TElement> vec; 
public: 

MyClass& operator+(TElement n) { 
    vec.push_back(n); 
    return *this; 
} 
int getS() { 
    return vec.size(); 
} 
iterator begin() {//here is some problems 
    return vec.begin(); 
} 
iterator end() { 
    return vec.end(); 
} 
}; 

int main() { 
    MyClass<int> mm; 
    mm = mm + 10; 
    mm = mm + 9; 
    double avg = 0.0; 
    for (auto g : mm) { //begin() and end() functions error 
     avg += mm; 
    } 
    cout<< avg/mm.getS(); 
    return 0; 
} 

오류 :

C2675 단항 '++': '표준 : : 반복자는'이 연산자 또는 미리 정의 된 연산자를 수용 할 수있는 형식으로 변환,

불법 간접를 정의하지 않습니다,

C2678 진 '! ='에는 운전자 유형 '표준 : : 반복자'의 왼쪽 피연산자를 취하는 발견,

C2955 '표준 : : 반복자': 클래스 템플릿의 사용 REQU IRES 템플릿 인수 목록,

C2514 '표준 : : 반복자': 클래스

+0

[간단하지 않습니다] (https://stackoverflow.com/questions/8054273/how-to-implement-an-stl-style-iterator-and-avoid-common-pitfalls). –

+1

[C++ 11 foreach 구문 및 사용자 지정 반복기]의 가능한 복제본 (http://stackoverflow.com/questions/7562356/c11-foreach-syntax-and-custom-iterator) –

+2

항상 실제, 완전한, 오류 메시지. – renemilk

답변

0

귀하의 beginend 기능은 다음과 같이 할 필요가없는 생성자가 없습니다 :

실제 반복자 타입의
typename vector<TElement>::iterator begin() { 
    return vec.begin(); 
} 

typename vector<TElement>::iterator end() { 
    return vec.end(); 
} 

그 벡터 반환합니다. 대조적으로, std::iterator은 완전히 다른 관련없는 유형입니다.

+0

이 구문을 설명해주십시오. "typename 벡터 :: iterator" – paulc

+0

@paulc : https://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and-typename-keywords –

0
typedef typename vector<TElement>::iterator Iterator; 

    Iterator begin() {//here is some problems 
     return vec.begin(); 
    } 

    Iterator end() { 
     return vec.end(); 
    } 

더 좋을 것입니다.

템플릿 선언이나 정의에 사용되는 이름을 그 템플릿 - 매개 변수에 따라 달라 가 해당 이름 조회가 유형 이름을 발견 하지 않는 유형의 이름을하지 않는 가정 또는 이름에 의해 자격 키워드 typename.

우리는 vector<TElement>::iteratortype 아닌 variable 있는지 확인해야합니다.