Operator Überladung ... überladen ;-)



  • hustbaer schrieb:

    Natürlich geht das. Bloss kannst du dir nicht aussuchen welche Funktion als besser bewertet und ausgewählt wird. Die "..." Funktion wird immer fix als schlechter bewertet, und kommt daher nur dran, wenn andere Funktionen nicht möglich sind

    Bei mir sagt (oben genannter) Compiler:

    error C3066: there are multiple ways that an object of this type can be called with these arguments
    

    Ich habe allerdings auch noch einen (void) Fall!



  • Ist zwar nicht gerade so, dass ich nicht wüsste, was ihm da missfällt. Ich würde jedoch gerne die Optimierung für diesen Code-Abschnitt ausschalten.

    Code in eine eigene Compilierungseinheit (sprich: cpp-Datei) auslagern und entsprechende Einstellungen fuer diese Datei vornehmen.

    Und zu deinem ganzen Problem jetzt die nicht ganz so einfache Antwort: In C gibt es va_list, fuer C++ hier mit Beispielen: http://www.cplusplus.com/reference/clibrary/cstdarg/ .

    Edit: Ich sehe aber grad, das hustbaer schon darauf verwiesen hat.



  • knivil schrieb:

    Code in eine eigene Compilierungseinheit (sprich: cpp-Datei) auslagern und entsprechende Einstellungen fuer diese Datei vornehmen.

    Und zu deinem ganzen Problem jetzt die nicht ganz so einfache Antwort: In C gibt es va_list, fuer C++ hier mit Beispielen: http://www.cplusplus.com/reference/clibrary/cstdarg/ .

    1. Was heißt entsprechende Einstellungen? Auch nach deaktivierten Optimierung kommt der Fehler.

    2. Ich kann va_list, aber dass hat nicht direkt mit meinem Problem zu tun, oder worauf willst du hinaus?



  • Hm.
    OK, das checkt der MSVC dann nimmer - wundert mich jetzt auch etwas, aber ist halt so. Müsste mal im Standard nachlesen was der dazu sagt.

    Den parameterlosen Overload weglassen, so dass bei Aufruf ohne Parameter einfach die "..." Variante ausgewählt wird ginge für dich nicht?



  • Ist zwar nicht gerade so, dass ich nicht wüsste, was ihm da missfällt

    Was misfällt ihm denn?



  • hustbaer schrieb:

    Den parameterlosen Overload weglassen, so dass bei Aufruf ohne Parameter einfach die "..." Variante ausgewählt wird ginge für dich nicht?

    Nein, leider nicht. Ich kann per Assembler ja schlecht überprüfen, ob da was auf dem Stack liegt oder nicht (außer den lokalen Variablen versteht sich).

    hustbaer schrieb:

    Ist zwar nicht gerade so, dass ich nicht wüsste, was ihm da missfällt

    Was misfällt ihm denn?

    Hat nichts mit dem Thema hier zu tun, aber:
    Mittlerweile kommt die Meldung nicht mehr, dennoch möchte er folgenden Code nicht compilieren:

    template<class Container,
             typename R, typename P1,
    		 R (Container::*Func)(P1)>
    

    bei jedem Template Argument sagt er:

    could not deduce template argument for 'R'  // das gleiche für P1 und Func
    


  • FrEEzE2046 schrieb:

    template<class Container,
             typename R, typename P1,
    		 R (Container::*Func)(P1)>
    

    bei jedem Template Argument sagt er:

    could not deduce template argument for 'R'  // das gleiche für P1 und Func
    

    Mangles code kann man wiedermal nur raten was da schief läuft. Meine Glaskugel mutmaßt dass du da ein Funktionstemplate hast und es ohne Angabe der Templateparameter aufrufst, und dass die Funktionsparameter nicht ausreichen um die Templateparameter herzuleiten.



  • pumuckl schrieb:

    Mangles code kann man wiedermal nur raten was da schief läuft. Meine Glaskugel mutmaßt dass du da ein Funktionstemplate hast und es ohne Angabe der Templateparameter aufrufst, und dass die Funktionsparameter nicht ausreichen um die Templateparameter herzuleiten.

    Es existiert noch gar kein Code. Aber so lässt sich der Fehler generieren:

    template<class Container,
             typename R, typename P1,
    		 R (Container::*Func)(P1)>
    blub()
    {
    
    }
    
    //Aufruf:
    class Bla {
    public:
      int methode(int) {return 0;}
    
      void ui() {
        blub<Bla, int, int, &methode>();
      }
    };
    


  • 1. Was heißt entsprechende Einstellungen? Auch nach deaktivierten Optimierung kommt der Fehler.

    Ich habe dir nur gesagt, wie man die Optimierung ausschaltet. Der Fehler wird durch deinen Quelltext verursacht und hat nichts mit Optimierung zu tun.



  • knivil schrieb:

    1. Was heißt entsprechende Einstellungen? Auch nach deaktivierten Optimierung kommt der Fehler.

    Ich habe dir nur gesagt, wie man die Optimierung ausschaltet. Der Fehler wird durch deinen Quelltext verursacht und hat nichts mit Optimierung zu tun.

    Warum kommt dann die Meldung vom Optimization Compiler?



  • Ich glaube, du mußt explizit die Klasse angeben, d.h.

    blub<Bla, int, int, &Bla::methode>();
    


  • FrEEzE2046 schrieb:

    Warum kommt dann die Meldung vom Optimization Compiler?

    Weil der Microsoft Compiler nunmal ein optimierender Compiler ist, auch wenn die Optimierungen abgeschaltet sind?

    So wie ein Auto in der Lage ist zu fahren, auch wenn der Motor jetzt gerade mal ausgeschaltet ist.

    Th69 schrieb:

    Ich glaube, du mußt explizit die Klasse angeben, d.h.

    blub<Bla, int, int, &Bla::methode>();
    

    Vöölig richtig. Es gibt keine Funktion &methode (zumindest nicht im Beispiel). Nur &Bla::methode.



  • Ich habs inzwischen gelöst.
    Bzgl. des Compilers: Da hier extra der Name "Optimization" auftauchte, liegt der Verdacht doch nahe, dass es sich um einen Teil des Compilers handelt, der nur für Optimierung gedacht ist oder?



  • Liegt nahe, ist aber falsch.

    Der Compiler von Microsoft für die Sprachen C und C++ heißt nunmal (auf deutsch) "Microsoft C/C++-Optimierungscompiler".

    Sehr gut nachzuvollziehen auch wenn Du cl.exe ohne Optionen startest.



  • LordJaxom schrieb:

    "Microsoft C/C++-Optimierungscompiler".

    rofl

    Der compiliert also Optimierungen 🙂


Anmelden zum Antworten