Spróbuj
auto p = static_cast<void(*)()>(& h<int>);
Ponieważ gcc traktuje funkcję jak przeciążony jednej matrycy. Z punktu widzenia gcc jest tak, jakbyś miał h(int param)
i h(float param)
- który z kompilatorów musi wybrać?
Zauważyłem, jaki był problem w starszych wersjach gcc, ale spróbuję wyjaśnić to dokładniej. GCC nie mógł wydedukować typu, ponieważ funkcja szablonowa była traktowana jak przeciążona. To było w zasadzie jak to masz następujące elementy:
void h(int)
{
}
void h(float)
{
}
void (*p)(int) = & h; //ok
void (*p)(float) = & h; //ok
auto p = & h; //error: which version of h?
Dla gcc h<int>
było jak przeciążony h
funkcji z niekończącymi alternatyw zależności T
parametru. Z podanym kodem był O.K. aby wykonać następujące czynności:
void (*p)() = & h<int>;
(dlatego ja nie dostać typedefed „obejście”)
Tak jak myślałem OP chciał użyć C++ 11 auto
hasła jak sugeruje znacznika, Statycznie odlewałem h<int>
na void(*)()
, co jest rodzajem braku operacji, po to tylko, aby oszukać gcc, ponieważ nie było w stanie poprawnie obsłużyć funkcji szablonów i nie było możliwe.
Funkcje void h<int>()
i void h<float>()
powinny być oczywiście traktowane jak różne funkcje za pomocą tego samego typu wskaźnika, a nie przeciążać wersji funkcji h
.Gdy instancja powinni zachowywać się jak void hInt()
i void hFloat()
i powinieneś być w stanie wykorzystać auto jak tutaj:
void hInt()
{
}
void hFloat()
{
}
auto p = hInt;
p = hFloat;
Ale z jakiegoś powodu dla gcc byli jak przeciążonych wersji h
.
Podaj powód do odrzucenia.
Kompiluje dobrze na Visual Studio 2010. Jest to najprawdopodobniej usterka w GCC. To, co możesz spróbować, to 'decltype (& h) p = & h ;' –
Puppy
Działa przynajmniej z G ++ 4.6. – Maister
@DeadMG: Bez "auto" nie ma nawet potrzeby pisania na klawiaturze, 'void (* p)() = & h;' również się skompiluje. –
doc