2016-06-10 6 views
1

Ich möchte C++ 11 "für Schleife" verwenden, um Elemente eines Vektors zu iterieren, aber ich erhalte einige Fehler (begin() und end() Funktionen denke ich ist ein Problem). Danke!STL-Vektor: Iterate Elemente

#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; 
} 

Fehler:

C2675 unären '++': ':: Iterator std' wird nicht definiert, diesen Operator oder eine Umwandlung in einen Typ akzeptablen dem vordefinierten Operator

illegal Indirektion,

C2678 binäre '=': gefunden kein Operator, der einen linken Operanden vom Typ 'std :: Iterator' nimmt,

C2955 'std :: Iterator': Verwendung von Klassenvorlage requ ires Vorlage Argumentliste,

C2514 'std :: Iterator': Klasse hat keine Konstrukteuren

+0

[Es ist nicht so einfach] (https://stackoverflow.com/questions/8054273/how-to-implement-anstl-style-iterator-and-vermeiden-common-petfalls). –

+1

Mögliches Duplikat von [C++ 11 Foreach-Syntax und benutzerdefinierten Iterator] (http://StackOverflow.com/Questions/7562356/C11-Foreach-Syntax-and-Custom-iterator) –

+2

Sie sollten immer die tatsächliche, vollständige, Fehlermeldungen. – renemilk

Antwort

0

Ihre begin und end Funktionen so sein müssen:

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

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

, dass die tatsächliche Iteratortyp ist, dass die Vektor kehrt zurück. Im Gegensatz dazu ist std::iterator ein völlig anderer und nicht verwandter Typ.

+0

Sie können diese Syntax bitte erklären? "typenname vector :: 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(); 
    } 

Dies wird besser sein.

Ein Name in einer Template-Deklaration oder Definition verwendet und das ist abhängig von einem Template-Parametern angenommen wird, nicht eine Art zu nennen, es sei denn die anwendbare Namenssuche einen Typnamen findet oder der Namen qualifiziert durch die Keyword-Typname

müssen wir sicherstellen, dass vector<TElement>::iterator ist ein type, kein variable.