Trate
auto p = static_cast<void(*)()>(& h<int>);
Debido trata gcc función como una sobrecarga basados en plantillas. Desde el punto de vista del gcc, es como si tuvieras h(int param)
y h(float param)
, ¿cuál debe elegir el compilador?
Me di cuenta de cuál era el problema en versiones anteriores de gcc, pero trataré de explicarlo con más detalle. GCC no pudo deducir el tipo, porque la función de plantilla se trató como una sobrecargada. Era básicamente igual que lo tienen las siguientes:
void h(int)
{
}
void h(float)
{
}
void (*p)(int) = & h; //ok
void (*p)(float) = & h; //ok
auto p = & h; //error: which version of h?
para GCC h<int>
era igual sobrecargado h
función con un sinfín de alternativas en función de T
parámetro. Con el código proporcionado en cuestión, era O.K. hacer lo siguiente:
void (*p)() = & h<int>;
(por eso es que no consigo typedefed "work-around")
Mientras pensaba OP quería utilizar C++ 11 auto
palabra clave según lo sugerido por una etiqueta, Fundí estáticamente h<int>
en void(*)()
, que es una especie de no-operación, solo para engañar a gcc, porque no fue capaz de manejar las funciones de plantilla y auto
correctamente.
Las funciones void h<int>()
y void h<float>()
deben considerarse diferentes funciones con el mismo tipo de puntero y sin sobrecargar las versiones de la función h
.Cuando una instancia deben comportarse como void hInt()
y void hFloat()
y usted debería ser capaz de utilizar automóviles como aquí:
void hInt()
{
}
void hFloat()
{
}
auto p = hInt;
p = hFloat;
Pero por alguna razón de gcc eran como versiones sobrecargadas de h
.
Indique los motivos de los votos a favor.
Compila bien en Visual Studio 2010. Probablemente sea un error en GCC. Lo que podría intentar es 'decltype (& h) p = & h ;' –
Puppy
Funciona con G ++ 4.6 al menos. – Maister
@DeadMG: Sin "auto" ni siquiera hay necesidad de typedef, 'void (* p)() = & h;' también compilaría. –
doc