2016-10-04 1 views
1

Ich versuche Operator < < zu überladen, um nur alle zwei Elemente von STL-Containern zu drucken. Aber ich habe einen Fehler bei der Erstellung:Fehler: 'e' ist keine Klasse, Namespace oder Enumeration

error: 'e' is not a class, namespace, or enumeration 

Und hier ist mein Code:

#include <iostream> 
#include <vector> 

template<typename T> 
std::ostream& operator<<(std::ostream &out, T const &e){ 
    for(e::iterator it = e.begin(); it != e.end(); it = it + 2){ 
     out << *it << " "; 
    } 
    return out; 
} 

int main(){ 
    std::vector<int> v; 
    for(int i= 0; i < 10; i++){ 
     v.push_back(i); 
    } 

    std::cout << v; 
    return 0; 
} 
+0

ersetzen 'e :: iterator' von' T :: iterator' – purplepsycho

+0

Verwenden 'Auto && Es' – 101010

Antwort

4

Sie haben zwei Probleme hier.

Eins ist mit e::iterator. Sie können nicht auf einen Mitgliedstyp über ein Objekt zugreifen, Sie müssen den Typ verwenden. Stattdessen sollten Sie einfach auto it = e.begin() verwenden. Wenn Sie nicht verwenden können 11 C++, dann müssen Sie

typename T::const_iterator it = e.begin() 

Die typename ist erforderlich verwenden, weil der Name auf einem Template-Parameter abhängig ist, und die const_iterator benötigt wird, anstatt nur iterator, weil Der Parameter ist mit const markiert.

Allerdings ist Ihre gröbere Fehler in dieser Überlastung in erster Linie.

template<typename T> 
std::ostream& operator<<(std::ostream &out, T const &e){ 

Dies erklärt eine Überlastung für std::ostream Ausgang für jede Art . Dies ist sicher, dass Sie Kopfschmerzen zu verursachen, und, sicher genug, wenn Sie den ersten Fehler zu beheben, Sie eine mehrdeutige Funktion Anruffehlermeldung erhalten, wenn die Ausgabe versucht " ":

main.cpp:7:20: error: use of overloaded operator '<<' is ambiguous (with operand types '__ostream_type' (aka 'basic_ostream<char, std::char_traits<char> >') and 'const char [2]') 
     out << *it << " "; 
     ~~~~~~~~~~^~~~ 

Wenn Sie wirklich diese Arbeit machen wollen mit Ich denke, Sie überprüfen, ob etwas wie T::iterator existiert, und haben nur Ihre Überladung aktiviert, wenn das wahr ist. Etwas wie folgt aus:

template<typename T, typename = typename T::iterator> 
std::ostream& operator<<(std::ostream &out, T const &e){ 
    for(auto it = e.begin(); it != e.end(); it = it + 2){ 
     out << *it << " "; 
    } 
    return out; 
} 

Live demo

Verwandte Themen