Porblem mit [] Operator



  • Hallo,

    ich habe ein kleines Problem mit dem Index-Operator:

    template<class T>
    class Array
    {
        ...
    
        T operator[] (unsigned int) const;
        T & operator[] (unsigned int);
    
        ...
    };
    
    class MyType
    {
        ...
    };
    
    int main()
    {
        Array<Array<MyType> > MyObject;
        MyObject[1][2]. ... //Fehler
    }
    

    Der Compiler beschwert sich beid dieser Operation, dass er die Überladung des ersten Arrays nicht auflösen kann.
    Gedacht war es eignetlich als mehrdimensionales Array. (Das Array<Array<MyType> > gibt eine Referenz auf ein Array<MyType> Objekt zurück, das dann das MyType Objekt zurückgibt, mit dem ich arbeiten kann.)
    Das funktioniert aber leider nicht, da der Compiler nicht weiß, ob er den Konstanten [] Operator nehmen soll, oder nicht. Hier soll er ja den nicht-konstanten nehmen. Ich habe aber auch Operationen, in denen ich ein konstantes Objekt habe, und deshalb nur auf den konstanten [] Operator zugreifen kann.

    Wie kann ich dem Compiler sagen, dass er nur den konstanten Operator nehmen soll, wenn er muss, und sonst den nicht-konstanten.

    Oder kann ich das Problem besser lösen?

    Danke schon mal für eure Posts!

    mfG PGroe



  • Hmm, afaik macht der das automatisch. Wie lautet denn die Fehlermeldung?
    Übrigens kannst (solltest?) du den konstanten []-Operator eine konstante Referenz, nicht eine Kopie zurückgeben lassen.



  • PGroe schrieb:

    Das funktioniert aber leider nicht, da der Compiler nicht weiß, ob er den Konstanten [] Operator nehmen soll, oder nicht.

    Doch, der Compiler weiss das schon. Immerhin ist dein Objekt nicht konstant, also wird er auch die non-const Variante des Operators bevorzugen. Dein Fehler liegt an anderer Stelle. Am besten du postest mal die konkrete Fehlermeldung.



  • .filmor schrieb:

    Übrigens kannst (solltest?) du den konstanten []-Operator eine konstante Referenz, nicht eine Kopie zurückgeben lassen.

    Danke! Werde ich machen. Ist ne gute Idee.



  • groovemaster schrieb:

    PGroe schrieb:

    Das funktioniert aber leider nicht, da der Compiler nicht weiß, ob er den Konstanten [] Operator nehmen soll, oder nicht.

    Doch, der Compiler weiss das schon. Immerhin ist dein Objekt nicht konstant, also wird er auch die non-const Variante des Operators bevorzugen. Dein Fehler liegt an anderer Stelle. Am besten du postest mal die konkrete Fehlermeldung.

    Meine Fehlermeldung ist:
    d:\dateien\vsp\c++-übungen\aufgabe1.cpp(59): error C2666: 'Array<T>::operator`[]'': 3 Überladungen haben ähnliche Konvertierungen
    with
    [
    T=Array<MyType>
    ]



  • versuch mal:

    const T &operator[] (unsigned int) const;
    T & operator[] (unsigned int);
    

    Zumindest macht es die STL bei der std::vector template Klasse so...



  • bluecode schrieb:

    versuch mal:

    const T &operator[] (unsigned int) const;
    T & operator[] (unsigned int);
    

    Zumindest macht es die STL bei der std::vector template Klasse so...

    PGroe schrieb:

    .filmor schrieb:

    Übrigens kannst (solltest?) du den konstanten []-Operator eine konstante Referenz, nicht eine Kopie zurückgeben lassen.

    Danke! Werde ich machen. Ist ne gute Idee.

    !

    3 Überladungen? wieso hast du 3 Überladungen? Kannst du mal den Header zeigen?



  • Oder zeig einfach nur mal die dritte Überladung.



  • Die gibt es von Anfang an.

    Deshalb heißt es ja auch Operatoren überladen, wenn man den ersten von sich selbst definiert. (D.h. es gibt schon zwei.) Wenn ich dann noch einen Überlade, sind es schon 3: Voilà!

    Ich selbst habe nur zwei Überladungen definiert, aber es gibt immer eine standardmäßig.


  • Mod

    PGroe schrieb:

    Die gibt es von Anfang an.

    Deshalb heißt es ja auch Operatoren überladen, wenn man den ersten von sich selbst definiert. (D.h. es gibt schon zwei.) Wenn ich dann noch einen Überlade, sind es schon 3: Voilà!

    Ich selbst habe nur zwei Überladungen definiert, aber es gibt immer eine standardmäßig.

    das verstehst du falsch. überladung bezieht sich auf alle parameter - und ddas schließt den objekt-parameter einer memberfunktion ein. operator[] ist nur für pointer und integer eingebaut. vielleicht solltest du mal die fehlermeldung komplett zitieren. üblicherweise zeigt visual c++ alle kandidaten, zwischen denen es sich nicht entscheiden kann, an. die definition der klasse wäre auch hilfreich (op[] kann ja nur als memberfunktion definiert werden).



  • PGroe schrieb:

    Ich selbst habe nur zwei Überladungen definiert, aber es gibt immer eine standardmäßig.

    Nein, gibt es nicht. Klassen haben nur vier Funktionen/Operatoren implizit: default ctor, copy ctor, dtor und copy op. Und der default ctor auch nur dann, wenn du keinen ctor selbst definiert hast. Alles andere musst du explizit angeben.
    Und in deinem Code sind nur zwei op's [] zu sehen, die Fehlermeldung spricht aber von drei. Deshalb muss es noch irgendwo einen dritten op [] geben, der sich in seiner Signatur nicht entscheidend von den beiden anderen unterscheidet. So weist dein Codeschnipsel jedenfalls keinen Fehler auf und lässt sich problemlos kompilieren.
    Falls du einen aktuellen MSC verwendest, sollten eigentlich alle drei Überladungen ebenfalls in der Fehlermeldung aufgeführt werden und sich damit direkt im Editorfenster anspringen lassen.


Anmelden zum Antworten