Ich versuche, ein Stück Code zum Spaß mit C ++ - Vorlagen zu schreiben.
%Vor%Der obige Code wird nicht kompiliert:)
Bei 1, 2, 3 wird der gleiche Fehler erzeugt: Fehler C2593: 'operator & lt; & lt;' ist mehrdeutig
Alles, was ich versuche, ist das Überladen der & lt; & lt; Bediener mit jedem Container arbeiten. Ist das sinnvoll ? Wie wäre das möglich wenn möglich, wenn nicht warum?
EDIT :: Danke für Korrekturen :) 'sth' ist eine gute Lösung.
Ich bin nur neugierig, ob diese Ambiguität - wie Neil erklärte - verschwinden würde, wenn wir C ++ 0x Concepts verwenden könnten?
Sie können Ihren Operator & lt; & lt; Nur auf Vorlagenvorlagen anwenden, indem Sie angeben, dass der Vorlagenparameter "Container" selbst als Vorlage dient. Da die C ++ - Standardcontainer auch einen Zuordnungsvorlagenparameter haben, müssen Sie diesen auch als Vorlagenparameter von Container einfügen.
%Vor% Ihr neu definiertes operator<<
passt nicht nur zu Containern, sondern auch zu anderen Typen wie Ints und Strings. Deshalb beschwert sich der Compiler über Unklarheiten, wenn er das passende operator<<
zur Ausgabe "["
finden muss.
Eine Möglichkeit zur Umgehung dieses Problems besteht darin, die Ausgabefunktion umzubenennen:
%Vor% Sie können dann einfache Wrapper hinzufügen, um operator<<
für alle Container, die Sie drucken möchten, zu aktivieren:
Was ist der Fehler? Ich habe einen gesehen, du brauchst einen Typennamen:
%Vor% Was hier passiert, ist, dass der Compiler beim ersten Lesen nichts über Container weiß. Also müssen wir ihm ein bisschen helfen und ihm sagen, dass der Iterator ein Typ sein wird (syntaktisch könnte es ein beliebiger gültiger Name im Klassenbereich sein, also eine Funktion, Variable, ...). Beim Schreiben einer Vorlagenmethode muss jeder Typ, der vom Vorlagentyp abhängt, angeben, dass es sich um einen Typ mit dem Schlüsselwort typename
handelt.
Ihr Operator führt seine eigene Mehrdeutigkeit ein - er könnte selbst zum Drucken der Dinge verwendet werden, die er zu drucken versucht. Mein Rat:
Ok, jetzt deine Vorlage, es verursacht Verwirrung. Der Compiler kann sich nicht zwischen Ihrem Operator und dem, den Sie erwarten, entscheiden.
Vielleicht nicht so allgemein wie das, was Sie posten (Sie müssen den enthaltenen Typ übergeben), und hinterlässt am Ende ein zusätzliches Trennzeichen, aber Sie können dafür die STL verwenden:
%Vor%Wird ausgegeben:
[10 20]
Beachten Sie, dass sich das zusätzliche Trennzeichen am Ende der Sequenz befindet und dass zwischen dem [und dem ersten Element kein Anfangsabstand vorhanden ist.
Ссылка kann eine gute Lösung sein. Es funktioniert für STL-Container und das C-artige Array.
Tags und Links c++ stl templates operator-overloading