Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit operator<<() in Klasse (bool und manipulator)
BLUESCREEN3D
16-03-2006, 20:29
Ich habe ein Problem mit operator<<() in einer Klasse. Vereinfacht sieht die so aus:
class bla
{
private:
std::ostringstream oss;
public:
bla &operator<<(bool &value)
{
this->oss << value;
return(*this);
}
} bla;
bool value=true;
bla << value; //dies geht
bla << true; //dies geht nicht - warum?
bla << (bool)true; //dies geht nicht - warum?
bla << std::boolalpha << value; //wie kriege ich es hin, dass dies geht?
Von den vier letzten Zeilen kriege ich bei den letzten drei Fehler beim Kompilieren.
Bei den ersten beiden davon:
error: no match for ‘operator<<’ in ‘bla << true’
Und bei der letzten:
error: no match for ‘operator<<’ in ‘bla << std::boolalpha’
Für die letzte Zeile fehlt wohl ein Operator, aber die anderen beiden sollten doch eigentlich gehen!?
locus vivendi
16-03-2006, 21:29
bla << true; //dies geht nicht - warum?
bla << (bool)true; //dies geht nicht - warum?
Weil das beides R-Values sind, welche nicht an eine Referenz auf Nicht-Konstant gebunden werden können.
bla << std::boolalpha << value; //wie kriege ich es hin, dass dies geht?
Im Prinzip nicht anders als für andere Typen. Du musst bloß nachschauen, ob, und wenn ja welchen Typ std::boolalpha laut Standard hat.
BLUESCREEN3D
17-03-2006, 00:05
Weil das beides R-Values sind, welche nicht an eine Referenz auf Nicht-Konstant gebunden werden können.
Natürlich... mit const geht es -.-
Im Prinzip nicht anders als für andere Typen. Du musst bloß nachschauen, ob, und wenn ja welchen Typ std::boolalpha laut Standard hat.
Hier hatte ich auch das const vergessen. Jetzt geht es zumindest teilweise mit "const std::ios_base::fmtflags &".
Außerdem wundert es mich, dass ich den Parameter dann in meiner Funktion operator<<() mittels this->oss.setf() an den ostringstream übergeben muss und das gleiche mit this->oss << nicht geht...
Irgendwas stimmt da noch nicht so ganz :/
bla &operator<<(bool &value)
Warum uebergibst du ne referenz aufn bool ? das bool koenntest ruhig kopieren lassen ... dann gehts auch mit dem const bool
You can also call a manipulator by inserting it into an output stream or extracting it from an input stream, thanks to some special machinery supplied in the classes derived from ios_base. For example:
istr >> noskipws;
calls noskipws(istr).
deine manipulatoren sind glaub ich nicht ganz einfache datentypen sondern funktionsobjecte .... also mit nem int oder bool wirst da nicht wirklich weiterkommen ....
Ciao ...
BLUESCREEN3D
19-03-2006, 00:09
Warum uebergibst du ne referenz aufn bool ? das bool koenntest ruhig kopieren lassen ... dann gehts auch mit dem const bool
Das hatte ich in einer Auflistung der Funktionen von std::ostream so gesehen und deshalb übernommen. Ich habe jetzt auch nochmal in /usr/include/c++/4.0.0/ostream nachgeguckt und da wird das anscheinend nicht als Referenz übergeben.
Ist es nicht eigentlich performanter, das als Referenz zu übergeben?
deine manipulatoren sind glaub ich nicht ganz einfache datentypen sondern funktionsobjecte .... also mit nem int oder bool wirst da nicht wirklich weiterkommen ....
Stimmt, es hat jetzt so funktioniert:
bla &operator<<(std::ios_base &(*f)(std::ios_base &))
Für endl, ends und flush braucht man das gleiche mit ostream an Stelle von ios_base.
Aber wofür gibt es std::ostream &std::ostream::operator<<(std::ios &(*f)(std::ios &))? Ich konnte keinen Fall finden in dem das zur Anwendung kommt.
peschmae
19-03-2006, 06:07
Ist es nicht eigentlich performanter, das als Referenz zu übergeben?
Für fettes Zeugs das u.U. von irgend etwas abgeleitet wurde und für das ein Dutzend copy-Konstruktoren und Destruktoren aufgerufen werden müsste würde man keine Referenz verwenden ist das sicher performanter.
Aber für die Built-In Typen eher nicht - einen Bool zu erstellen heisst ja quasi nur ein Byte zu kopieren.
Ganz abgesehen davon ist ein Byte auch weniger als für einen Pointer benötigt wird.
MfG Peschmä
Mal abgesehen davon, das bool aus performancegruenden meist als INT mit der Registerbreite breite des Prozessors implementiert ist ...
also unter windows XP 32 bit nen 32 bit integer ist ...
Und zeiger (die intern verwendet werden um referenzen zu erstellen) zufaellig die gleiche definition haben ... isses quasi kein unterschied von der performance ob du bool referenzierst oder nich ... er kopiert jedesmal 4 byte ^^
@peschmae
falls du wirklich systeme hasst wo bool = 1 byte ist, und du laesst das auf nem 32bit system laufen ... und angenommen das BS und seine API sind auch 32bittig, dann waer die referenz schneller (geringfuegig), weil das kopieren von 4 byte schneller ist als das von nem einzelnen byte
Klingt komisch iss aber so ^^
Ciao ...
peschmae
20-03-2006, 17:37
Ich hasse so systeme, da hast du allerdings recht ;)
Beim Rest hast du allerdings durchaus recht :)
(meine Ausrede: ich leb im Moment gerade n bisschen in 8-Bit controllern :D)
MfG Peschmä
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.