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


Anmelden zum Antworten