2010-11-20 5 views
2

Ich versuche, den Stream-Insertion-Operator zu überlasten, so kann ich std :: vector auf std :: cout drucken, aber ich habe Probleme mit der Syntax.Wie Stream-Insertion-Operator mit einer Vorlage überladen?

Dies ist, was ich versuche:

template<typename T> std::ostream & operator<<(std::ostream &os, std::vector<T> &v) 
{ 
    std::copy(v.begin(), v.end(), std::ostream_iterator<T>(os, ', ')); 
    return os; 
}; 

Und ich wollte es so verwenden:

std::vector<float> v(3, 1.f); 
std::cout << v; 

Was für diese Art von Überladen von Operatoren die korrekte Syntax ist?

+1

Funktioniert für mich ... Außer für das offensichtliche '' '' '' '' – Kos

Antwort

2

Der Code ist fast in Ordnung, aber:

  • Der Separator ', ' falsch ist: Verwenden Sie ", "
  • Ihre Funktion könnte (und sollte), um eine konstante Referenz auf v nehmen: const std::vector<T> &v
  • There ist unnötig ; nach der Funktion schließen Klammer :)

Für das Protokoll, ', ' ist a multi-character constant vom Typ int, so beschwert sich der Compiler, dass keine Überladung von std::ostream_iterator Konstruktor der Argumentliste '(std::ostream, int)' entspricht.

+0

Ich war so unsicher in meinem C++ Template Syntax Wissen, dass ich angenommen habe, dass ich einen großen Fehler mache ... aber es war trivial. Vielen Dank. Frische Augen sehen besser. – Bojan

+0

nur, um eine Erklärung zu dem, was icecrime sagte, einzelnes Zitat wird verwendet, um _characters_ nicht _strings_ in C & C++ – tobyodavies

+0

Ich speichere meine Quelldateien als UTF-8 in Visual Studio, so Zeichen und String-Literale sind immer Single-Byte. – Bojan

Verwandte Themen