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
ersetzen 'e :: iterator' von' T :: iterator' – purplepsycho
Verwenden 'Auto && Es' – 101010