2016-11-01 4 views
-2

Edit: Definition von class TF:Ist es möglich, verschiedene Operator <<() Überladungen in eine Datei und Std :: Cout zu schreiben?

class TF { 
    std::vector<V4f> waypoints; 
    std::vector<int> densityWaypoints; 
public: 
    std::size_t size() const { return waypoints.size(); } 
    friend std::ostream& operator<<(std::ostream& str, const TF& tf); 
    friend std::fstream& operator<<(std::fstream& str, const TF& tf); 
    // methods here 
}; 

Die Frage aus der Tatsache, Dampf, daß ich Ströme nicht verstehen, so dass wahrscheinlich eine Voraussetzung.

Ist es irgendwie möglich, operator<<(std::ostream, T) zu überlasten, so dass, wenn aufgerufen, um die Datenstruktur auf dem Bildschirm anzuzeigen, es eine Überladung verwendet, und wenn die Datenstruktur in eine Datei geschrieben wird, wird eine andere verwendet? So etwas wie diese wohl:

std::ostream& operator<<(std::ostream& str, const TF& tf) { 
    for (std::size_t i = 0; i != tf.waypoints.size(); ++i) { 
     str << " { " 
      << tf.densityWaypoints[i] << " : " 
      << tf.waypoints[i][3] << " : " 
      << tf.waypoints[i][0] << " , " 
      << tf.waypoints[i][1] << " , " 
      << tf.waypoints[i][2] 
      << " } "; 
    } 
    str << "\n"; 
    return str; 
} 

std::fstream& operator<<(std::fstream& str, const TF& tf) { 
    str << (int)tf.size(); 
    for (std::size_t i = 0; i != tf.waypoints.size(); ++i) { 
     str << tf.densityWaypoints[i] 
      << tf.waypoints[i][0] 
      << tf.waypoints[i][1] 
      << tf.waypoints[i][2] 
      << tf.waypoints[i][3]; 
    } 

Dies kompiliert nicht mit einem seltsamen Fehler (ich kann müde sein):

error: no match for ‘operator<<’ (operand types are ‘std::fstream {aka std::basic_fstream}’ and ‘int’)

Der Fehler tritt auf, wenn ich die zweite operator<<() Überlastung hinzuzufügen. Der erste funktioniert gut. Versucht sowohl std::ofstream als auch std::fstream zum selben Ergebnis.

Aber ich bin mir nicht sicher, ob es auch funktionieren wird. Sicher ist es möglich, eine Funktion wie int writeTF(std:fstream& str, const TF&tf) zu definieren, aber das sieht für mich nicht nach C++ aus, ganz zu schweigen von dem seltsamen Fehler, der möglicherweise auch hier auftauchen wird.

+1

Es ist natürlich möglich. –

+1

Können Sie uns ein Beispiel geben, wo der Fehler auftritt. Im Moment kompiliert der Code, den Sie uns präsentiert haben, aus verschiedenen Gründen nicht. – 0x499602D2

+0

@ 0x499602D2 veröffentlicht eine Verknüpfung der Klassendefinition – iksemyonov

Antwort

1

Ich habe einen Code gesehen, der die ostream Adresse mit der von cout vergleicht. Ich habe gemischte Gefühle darüber, aber es ist sicherlich gearbeitet:

std::ostream& operator<<(std::ostream& o, Foo const&) 
{ 
    if(&o == &std::cout) { 
     return o << "cout"; 
    } else { 
     return o << "not_cout"; 
    } 
} 

demo

Beachten Sie, dass cout Ausgänge auf die Standardausgabe, es ist nicht dasselbe wie „Bild“.

+0

"Der Bildschirm" ist natürlich eine menschliche Definition. – iksemyonov

+2

@iksemyonov der Punkt ist, dass die Ausgabe von dem Bildschirm in eine Datei mit den meisten Betriebssystemen umgeleitet werden kann. –

Verwandte Themen