Problem mit Funktionsaufruf
-
Hi,
ich habe das Problem, dass nicht die Funktion meiner Klasse aufgerufen wird, die ich erwarte.
class TEST { private: bool i_; unsigned j_; public: TEST() : i_(false), j_(0) { } ~TEST() { } void setI(bool i) { i_ = i; } void setI(std::stringstream& ss) { ss >> i_; } bool getI() { return i_; } void setJ(unsigned j) { j_ = j; } void setJ(std::stringstream& ss) { ss >> j_; } unsigned getJ() { return j_; } }; int main(int argc, char* argv[]) { char test1[1]={'0'}; char test2[10]={'1','2','3','4','5','6','7','8','9','0'}; TEST olli; olli.setI(std::stringstream(test1)); olli.setJ(std::stringstream(test2)); std::cout << olli.getI() << std::endl; std::cout << olli.getJ() << std::endl; return 0; }Der Compiler schmeißt nun folgende Message "warning C4800: 'void *': Variable wird auf booleschen Wert ('True' oder 'False') gesetzt (Auswirkungen auf Leistungsverhalten möglich)".
Es wird bei olli.setI(std::stringstream(test1)) leider nicht die richtige Funktion aufgerufen, sondern die Funktion TEST::setI(bool i)?????
Bei olli.setJ(std::stringstream(test2)) funktioniert es wie erwartet!!!
Kann mir vielleicht jemand dieses Verhalten erklären.
Liebe Grüße
Olli
-
Rvalues (wie die temporären Stringstreams, die du da erstellst) können nicht als nicht-const-Referenzen übergeben werden. Eigentlich sollte setJ auch nicht funktionieren.
-
std::stringstream hat einen überladenen void*-Cast-Operator für Fehlerprüfungen damit z.B. folgendes funktioniert:
int i; while(std::stringstream >> i) { }Dabei wird ein NULL-Zeiger zurückgegeben, wenn irgendwas bei der Einleseoperation schief gegangen ist. Das nennt sich "Safe Bool Idiom".
Der Grund, warum er bool auswählt und nicht std::stringstream ist der, dass temporär erzeugte Variablen nicht als non-const Referenz übergeben werden dürfen.
Wenn Du std::stringstream aus den Aufrufen herausziehst, geht es so, wie Du erwartest:std::stringstream str1(test1); olli.setI(str1); std::stringstream str2(test2); olli.setJ(str2);
-
MFK schrieb:
Rvalues (wie die temporären Stringstreams, die du da erstellst) können nicht als nicht-const-Referenzen übergeben werden. Eigentlich sollte setJ auch nicht funktionieren.
Leider geht das bei VC9.
-
Vielen Dank für eure schnellen Antworten! Es hat mir sehr geholfen.
Gruß
Olli