Wie könnte ich den Inhalt eines Containers allgemein drucken?

8

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?

    
AraK 20.07.2009, 15:21
quelle

7 Antworten

7

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%     
jon-hanson 20.07.2009, 16:56
quelle
4

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:

%Vor%     
sth 20.07.2009 15:47
quelle
3

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.

    
Matt Price 20.07.2009 15:22
quelle
2

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:

  • Verwenden Sie eine benannte Funktion, kein opertr
  • Übergeben Sie den Container per const-Verweis (dies hat jedoch nichts mit dem Problem zu tun)
anon 20.07.2009 15:44
quelle
1

Ok, jetzt deine Vorlage, es verursacht Verwirrung. Der Compiler kann sich nicht zwischen Ihrem Operator und dem, den Sie erwarten, entscheiden.

    
Matt Price 20.07.2009 15:32
quelle
1

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.

    
quelle
0

Ссылка kann eine gute Lösung sein. Es funktioniert für STL-Container und das C-artige Array.

    
cqdjyy01234 16.02.2014 09:13
quelle