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::functionist 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.