Parece que desea "copiar" la firma de otra función para crear una función con la misma firma. Como decltype(foo)
es de hecho el tipo de función (y no un puntero a esa función, que sería decltype(&foo)
y llevaría a una declaración de puntero), puede usarla para declarar una función con la misma firma que otra función.
como lo indica el error de vinculador:
undefined reference to `Bar::blubb(int)'
esto ya no tendrán ningún problema con su compilador. Sin embargo, parece que gcc aún no implementó completamente esta parte del estándar, ya que no aceptará la sintaxis para lo mismo con un operador de llamada de función. Clang por cierto. estará feliz de aceptarlo y el enlace a continuación, los errores con
undefined reference to `Bar::operator()(int)'
Su pregunta acerca de por qué existe ese error enlazador indica una falta de comprensión de lo que lo hace realmente decltype.
Simplemente evaluará a un tipo, no más. La definición de blubb
no está de ninguna manera vinculada a la definición de foo
. Esto podría ser más clara cuando se escribe como si fuera
typedef decltype(foo) x;
x blubb;
Ahora puede alternativamente typedef x ser explícitamente el tipo de función, que no se modificaba en modo alguno lo que es blubb. Aún necesitas definirlo.Y puesto que no hay sintaxis para definirla usando decltype, usted tiene explícitamente a escribir como
int Bar::operator()(int) {
...
}
que probablemente y desafortunadamente se anule el propósito/beneficio del uso de decltype para la declaración, ya que no le permitirá automáticamente "copia" una firma.
¿De verdad quieres el tipo de la función, o en su lugar las funciones devuelven el tipo (que puedes obtener "simulando" una llamada como 'decltype (foo (0))') –
Diría que gcc aún no lo ha hecho implementado. Funciona bien en clang. – PlasmaHH
@phresnel: mirando cómo lo invoca ('bar (6)') Supongo que quiere la función. Sin embargo, me pregunto si el error del enlazador es una queja (se espera cuando no se define la función), o simplemente para mostrar que creó la función muy bien. – PlasmaHH