Zweideutigkeit zwischen ==Operator und Umwandlungsoperator

FireFlow

Erfahrenes Mitglied
Narf wieder ein Problemchen...

Ich hab wie vorhin immer noch die Klasse rational. Folgende Situtation (nur die bedeutenden Dinge in dem Quellcode nun):

Code:
class rational
{
 public:
     // Konstruktor 
     rational(); // kein Wert beim Erstellen des Objekts
     rational(double const& a); // Umwandlung von Double in einen Bruch
     rational(int const& a, int const& b); // Bruch als a/b, wird noch gekürzt (wenn möglich)
     // (...)  
     // Konvertierungsopeartor
     operator double() const;

 private:
     // (...)
};

// Dann noch folgende Operatoren-Überladung:
bool const operator == (rational const& a, rational const& b);

Ich hab den Konvertierungsoperator hinzugefügt dass man z.b. anstatt cout<<instanz.toDouble(); einfach cout<<instanz schreiben kann. Jetzt hab ich aber ein Problem bei einem logischen Vergleich:

Code:
rational bruchzahl(1,8); // Bruchzahl 1 Achtel erzeugen
if(bruchzahl==0.125) // HIER FEHLER
{
    cout << "1/8 = " << bruchzahl; // geht mit Umwandlungsoperator
}

Fehler: [C++ Error] test.cpp(35): E2015 Ambiguity between 'operator ==(const rational &,const rational &)' and 'rational::operator double() const'

Also weis der Compiler nun wohl nicht ob er das Objekt der Klasse rational zu einem Double casten soll, oder ob er ein temporäres Objekt für den double-Wert erzeugen soll. Was von beidem er macht ist mir so ziemlich Wurst solange er sich für etwas entscheiden könnte. Wobei der Aufruf vom Umwandlungsoperator wohl besser wäre da man kein temp. Objekt benötigt.

Habe bereits versucht den Konstruktor rational(double const& a); explicit zu deklarieren. Dann aber hab ich wiederrum ein Problem bei einer einfachen Zuweisung:
Code:
 rational test;
test = 0.125; // geht dann nicht mehr, müsse test=rational(0.125); heißen

Hoffe irgendjemand hat eine Idee wie ich das anstellen könnte!

Gruss FireFlow
 
Versuch mal einen Vergleichsoperator mit einem double zu machen. Das müsste der Compiler dann direkt einsetzen können und sich nicht an dem Ratespiel versuchen.
 
Zurück