Array of function pointers in MSVC10



  • Hallöchen Community,

    mein Problem ist eigentlich recht simpel. Wie ich es schon betitelt habe, möchte ich einen Array mit Funktionspointern schreiben. Dabei benutze ich den MSVC10-Compiler, weil ich derzeit mit Qt5 arbeite. Dies löse ich ungefähr so:

    #include <complex>
    
    typedef std::complex<long double> Complex;
    typedef Complex(*MathFunction)(const Complex&);
    
    MathFunction function_ptrs[] = {
        std::acos,
        ...
    };
    
    int main() { return 0; }
    

    Nun krieg ich aber eine Fehlermeldung raus:

    error C2440: 'initializing' : cannot convert from 'overloaded-function' to 'MathFunction'
    

    Ich will mal lautstark behaupten, dass ich std::acos nicht übergeben kann, weil es zwei davon gibt - einmal im cmath-Header und einmal im complex-Header, wobei der Compiler dann schlussendlich nicht weiß, welche der beiden Funktionen er denn nun nehmen soll (wobei mich das wiederrum verwirrt, weil ich den cmath-Header nicht mal inkludiert habe). Nun dachte ich mir, es würde funktionieren, wenn ich die Funktion einfach caste, sprich...

    MathFunction function_ptrs[] = {
        static_cast<MathFunction>(std::acos),
        ...
    };
    

    ...aber...

    error C2440: 'static_cast' : cannot convert from 'overloaded-function' to 'MathFunction'
    

    Mit einem Array vom Typ std::function ist es die gleiche Leier.

    Ich habe den Code mit G++ kompiliert gehabt, und mit dem lief es einwandfrei. Das, was ich aber um jeden Preis vermeiden will, ist, dass ich die Qt-Library jetzt auch noch für GCC kompilieren muss, oder die pre-compiled Version downloaden muss. Ich möchte das ganze dennoch mit dem MSVC10-Compiler lösen.

    Was ich also suche, ist ein Workaround. Gibt es denn gar keine Möglichkeit diese Funktionspointer in ein Array reinzuhauen, ohne dass mir der Compiler eine reinhaut? 😞
    ~Optionale Frage: Ist das ein Bug vom MSVC10-Compiler?~



  • Beim gcc und ideone klappt es ohne Probleme.
    Versuche mal einen reinterpret_cast.



  • Dein Code sieht für mich völlig korrekt aus (hab leider kein MSVC10). Beide Fälle sind genau so im Standard abgedeckt (13.4 bzw. [over.over]).

    reinterpret_cast ist hier aber völlig fehl am Platz.



  • Hmm, vielleicht stimmt das doch nicht, was ich gesagt habe. acos ist ja ein Template.

    Versuch mal

    std::acos<long double>
    

    oder

    std::acos<Complex::value_type>
    


  • simpelAntwort: netter Einfall, aber der erzeugt leider die gleiche Fehlermeldung 😞



  • Dürfte sich um einen Compilerbug handeln (sollte laut §13.4/1 imo funktionieren), wäre nett, wenn du das gleich auf Microsoft Connect reporten würdest: http://connect.microsoft.com/VisualStudio



  • std::acos für std::complex wurde erst mit C++11 eingeführt; diesen Standard unterstützt MSVC10 halt nicht vollständig. Er wird die Funktionsvorlage stumpf nicht haben.



  • In der Tat, MSVC11 kompilierts problemlos.



  • seldon: Stimmt, eben getestet.

    Ich denke auch grad an einen Bug, denn...

    void foo(int i);
    void foo(float f);
    
    void(*fptr_array[])(int) = {
    	foo
    };
    

    ...sowie...

    void foo(int i);
    void foo(float f);
    
    void(*fptr_array[])(int) = {
    	static_cast<void(*)(int)>(foo)
    };
    

    will einfach nicht kompilieren.
    Nadann! Auf zum ersten Bugreport! 😃

    Danke euch für die Hilfe.
    MfG, spiri.



  • Wie seldon schon geschrieben hat: Es ist kein Bug, es liegt einfach daran, dass MSVC 10 den entsprechenden Overload von std::acos noch nicht implementiert. In MSVC 11 funktioniert alles problemlos.


Anmelden zum Antworten