operator+



  • Hi,

    ich möchte folgendes aufrufen:

    DT_String u, v = "Hallo", w = "Welt!";
    u = v + w;
    
    // Zuweisungs-Operatoren
    public:
    	DT_String&		operator=(const char* apsString);
    	DT_String&		operator=(DT_String& apcString);
    	DT_String&		operator=(long alValue);
    
    // Addition-Operator
    public:
    	DT_String		operator+(const char* apsString);
    	DT_String		operator+(DT_String& apcString);
    	DT_String		operator+(long alValue);
    

    Bekomme aber folgende Fehlermeldung:

    error C2593: 'operator =' is ambiguous, could be 'DT_String &DT_String::operator =(long)' or 'DT_String &DT_String::operator =(const char *)' ..
    while trying to match the argument list '(DT_String, DT_String)'

    Was mache ich hier falsch? 😕



  • Hast du eventuell einen DT_String::operator long() definiert (explizite Typumwandlung)? Ansonsten könntest du auch versuchen, den Parameter von operator+ und operator= als "const DT_String&" zu deklarieren - außer du hast wirklich vor, deinen Parameter zu verändern.

    (achja: In welcher Zeile tritt denn der Fehler auf?)

    *etwas länger hinsieht* operator=(DT_String& kann nicht angewendet werden, weil der Compiler keine nicht-konstante Referenz an eine temporäre Variable binden kann (und der Rückgabewert von op+ ist eine temporäre Variable, selbst wenn die rausoptimiert werden kann).



  • Hast du eventuell einen DT_String::operator long() definiert (explizite Typumwandlung)?

    Ja, hab ich. Wenn ich's raushaue, dann funktioniert's.

    Merci



  • Beste Lösung dürfte tatsächlich sein, die "internen" Operatoren mit konstanten Strings zu definieren:

    DT_String& operator=(const DT_String& other);
    DT_String  operator+(const DT_String& other) const;
    

    Der nichtkonstante Zuweisungsoperator kann in deinem Beispiel nicht angewendet werden, weil der Compiler davon ausgehen muß, daß du den Parameter ändern willst - und den Rückgabewert von op+ kannst du nicht ändern (bzw. hat das keine Auswirkungen, da das Objekt sich sofort nach der Zuweisung selbst vernichtet). Also sucht der Compiler nach "Umwegen" - einer führt über eine char*-Konvertierung zu op=(const char*), der andere über eine long-Konvertierung zu op=(long) - da beide Wege gleich gut sind, steht er vor einer Patt-Situation.


Anmelden zum Antworten