Mathias Brodala: (C++) GCC: Keine Kandidaten in Template-Klasse gefunden

Hallo.

Ich arbeite zur Zeit unter Anderem zu Übungszwecken an einer Array-Klasse, welche Objekte jeder Art beherbergen können und nützliche Methoden zur Arbeit damit zur Verfügung stellen soll. Hierzu habe ich Templates genutzt.

Das Problem nun: während mein Beispielcode im VisualStudio problemlos kompiliert und erfolgreich ausgeführt wird, bricht der GCC nur mit einer eher kryptischen Meldung ab:

$ make
g++  -Wall -g main.cpp -o ac
main.cpp: In function ‘int main()’:
main.cpp:43: error: no match for ‘operator=’ in ‘c = Marray<T>::operator+(Marray<T>&) [with T = int](((Marray<int>&)(& b)))’
marray.h:137: note: candidates are: Marray<T>& Marray<T>::operator=(Marray<T>&) [with T = int]
marray.h:160: note:                 Marray<T>& Marray<T>::operator=(T) [with T = int]
make: *** [ac] Fehler 1

Kann mir jemand dies vielleicht etwas verständlicher erklären?

Hier die Quellcodes zu meiner Klasse und dem Beispielcode. (Makefile, falls erforderlich)

Gruß, Mathias

--
ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
debian/rules
  1. Moin!

    main.cpp: In function ‘int main()’:
    main.cpp:43: error: no match for ‘operator=’ in ‘c = Marray<T>::operator+(Marray<T>&) [with T = int](((Marray<int>&)(& b)))’
    marray.h:137: note: candidates are: Marray<T>& Marray<T>::operator=(Marray<T>&) [with T = int]
    marray.h:160: note:                 Marray<T>& Marray<T>::operator=(T) [with T = int]
    make: *** [ac] Fehler 1

    Kann mir jemand dies vielleicht etwas verständlicher erklären?

    Du versuchst in Zeile 43ff. der Datei `main.cpp´ den „=“-Operator in einer Weise aufzurufen, in der er nicht definiert ist. Die Angabe dahinter „in ‘c = Marray<T>::operator+(Marray<T>&) [with T = int](((Marray<int>&)(& b)))“ stimmt mich etwas verwundert.

    Hier die Quellcodes zu meiner Klasse und dem Beispielcode.

    Schade:
    You don't have permission to access /c++/Marray/main.cpp on this server.

    Wenn ich mal in die main.cpp schauen dürfte?

    Viele Grüße,
    Robert

    1. Hallo Robert.

      main.cpp: In function ‘int main()’:
      main.cpp:43: error: no match for ‘operator=’ in ‘c = Marray<T>::operator+(Marray<T>&) [with T = int](((Marray<int>&)(& b)))’
      marray.h:137: note: candidates are: Marray<T>& Marray<T>::operator=(Marray<T>&) [with T = int]
      marray.h:160: note:                 Marray<T>& Marray<T>::operator=(T) [with T = int]
      make: *** [ac] Fehler 1

      Kann mir jemand dies vielleicht etwas verständlicher erklären?

      Du versuchst in Zeile 43ff. der Datei `main.cpp´ den „=“-Operator in einer Weise aufzurufen, in der er nicht definiert ist. Die Angabe dahinter „in ‘c = Marray<T>::operator+(Marray<T>&) [with T = int](((Marray<int>&)(& b)))“ stimmt mich etwas verwundert.

      Ja, soweit habe ich dies verstanden. Mein überladener „+“-Operator gibt also offenbar etwas zurück, was mein „=“-Operator nicht erwartet. Doch beides stimmt überein.

      Hier die Quellcodes zu meiner Klasse und dem Beispielcode.

      Schade:
      You don't have permission to access /c++/Marray/main.cpp on this server.

      Wenn ich mal in die main.cpp schauen dürfte?

      Ja, die Berechtigungen habe ich nun korrigiert.

      Einen schönen Mittwoch noch.

      Gruß, Mathias

      --
      ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
      debian/rules
      1. Hallo nochmal.

        main.cpp: In function ‘int main()’:
        main.cpp:43: error: no match for ‘operator=’ in ‘c = Marray<T>::operator+(Marray<T>&) [with T = int](((Marray<int>&)(& b)))’
        marray.h:137: note: candidates are: Marray<T>& Marray<T>::operator=(Marray<T>&) [with T = int]
        marray.h:160: note:                 Marray<T>& Marray<T>::operator=(T) [with T = int]
        make: *** [ac] Fehler 1

        Kann mir jemand dies vielleicht etwas verständlicher erklären?

        Du versuchst in Zeile 43ff. der Datei `main.cpp´ den „=“-Operator in einer Weise aufzurufen, in der er nicht definiert ist. Die Angabe dahinter „in ‘c = Marray<T>::operator+(Marray<T>&) [with T = int](((Marray<int>&)(& b)))“ stimmt mich etwas verwundert.

        Ja, soweit habe ich dies verstanden. Mein überladener „+“-Operator gibt also offenbar etwas zurück, was mein „=“-Operator nicht erwartet. Doch beides stimmt überein.

        Schon schön, was ein paar erläuternde Worte doch bewirken können. Nach dem ich nun (1) auf das temporäre Objekt innerhalb von „operator+“ verzichtet habe und (2) statt dessen *this (3) als Referenz zurückgebe, kompiliert es nun auch im GCC problemlos und kann ausgeführt werden. Wie ich gerade getestet habe, läuft es auch noch immer im VisualStudio, das Problem ist also gelöst.

        Gestern Abend hat mir obiges Zeichenwirrwarr (ernsthaft) Kopfschmerzen bereitet.

        Hier die Quellcodes zu meiner Klasse und dem Beispielcode.

        Schade:
        You don't have permission to access /c++/Marray/main.cpp on this server.

        Wenn ich mal in die main.cpp schauen dürfte?

        Danke für deine Bemühung.

        Einen schönen Mittwoch noch.

        Gruß, Mathias

        --
        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
        debian/rules
        1. Moin Mathias!

          Danke für deine Bemühung.

          Keine Ursache. C++ kann manchmal doch wie ein Hamsterbau sein: Man pustet in ein Loch herein und schaut, wo der Hamster herauskommt (Zitat meines damaligen Informatik-Lehrers).

          Schönes Wochenende,
          Robert

          1. Hallo Robert,

            C++ kann manchmal doch wie ein Hamsterbau sein: Man pustet in ein Loch herein und schaut, wo der Hamster herauskommt (Zitat meines damaligen Informatik-Lehrers).

            sehr amüsante Vorstellung. ;-)
            Aber da ist was dran - genau so kommt mir C++ auch oft vor: Wir probieren mal das hier, und schauen, was dabei rauskommt. Irgendwie habe ich den Eindruck, dass da vieles nicht wirklich logisch nachvollziehbar ist. Da bleibe ich doch lieber bei meinem Plain C (ohne ++) und bilde OO-Ansätze mit geeigneten structs und Zeigern auf Funktionen selbst nach. Dann kann ich wenigstens eindeutig nachvollziehen, was da wirklich passiert.

            Schönes Wochenende,

            Danke ebenso,
             Martin

            --
            Bitte komme jemand mit einem *g* zum Wochenende, damit nicht über mich gelacht wird.
              (Gunnar Bittersmann)