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.
Es ist natürlich möglich. –
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
@ 0x499602D2 veröffentlicht eine Verknüpfung der Klassendefinition – iksemyonov