Versuchen
auto p = static_cast<void(*)()>(& h<int>);
Da gcc behandelt Funktion als überlastet ein Templat. Aus Sicht des GCC ist es so, als hätten Sie h(int param)
und - welchen muss der Compiler wählen?
Ich bemerkte, was das Problem in älteren Versionen von gcc war, aber ich werde versuchen, es ausführlicher zu erklären. GCC konnte den Typ nicht ableiten, da die Template-Funktion wie eine überladene Funktion behandelt wurde. Es war im Grunde wie Sie die folgenden würde:
void h(int)
{
}
void h(float)
{
}
void (*p)(int) = & h; //ok
void (*p)(float) = & h; //ok
auto p = & h; //error: which version of h?
Für gcc h<int>
war wie überlastet h
Funktion mit endlosen Alternativen abhängig von T
Parameter. Mit dem in Frage gestellten Code war es O.K. Folgendes zu tun:
void (*p)() = & h<int>;
(das ist, warum ich nicht bekommen typedefed "work-around")
Wie ich dachte OP C++ 11 auto
Schlüsselwort verwenden wollte, wie durch einen Tag vorgeschlagen, Ich statisch h<int>
void(*)()
gegossen, die Art von No-Operation ist, nur um gcc Trick, weil es nicht in der Lage war, mit Vorlagenfunktionen und auto
richtig umzugehen.
Die Funktionen void h<int>()
und void h<float>()
sollten natürlich wie verschiedene Funktionen mit dem gleichen Zeigertyp behandelt werden und nicht überladen Versionen von h
Funktion.Wenn instanziiert sollten sie wie void hInt()
und void hFloat()
verhalten und Sie sollten Auto zu benutzen, wie hier in der Lage:
void hInt()
{
}
void hFloat()
{
}
auto p = hInt;
p = hFloat;
Aber für gcc aus irgendeinem Grund sie waren wie überladene Versionen von h
.
Bitte geben Sie einen Grund für downvotes.
Kompiliert auf Visual Studio 2010. Es ist wahrscheinlich ein Fehler in GCC. Was Sie versuchen könnten, ist 'declltype (& h) p = & h ;' –
Puppy
Funktioniert mit mindestens G ++ 4.6. – Maister
@DeadMG: Ohne "auto" gibt es sogar keine Notwendigkeit, dedef, 'void (* p)() = & h;' würde auch kompilieren. –
doc