Intento ajustar una función de plantilla con la ayuda del enlazador de GNU wrap opción. El código es el siguiente:Envoltura de la función de plantilla C++
// f.h
template<typename T>
void f(T t) {
}
// bar.h
void bar();
// bar.cpp
#include "bar.h"
#include "f.h"
void bar() {
f(42);
}
// test.cpp
extern "C" {
extern void __real__Z1fIiEvT_(int i);
void __wrap__Z1fIiEvT_(int i) {
__real__Z1fIiEvT_(i);
}
}
int main() {
bar();
}
el código mostrado anteriormente se vincula con el siguiente comando:
g++ -Xlinker -wrap=_Z1fIiEvT_ -o test test.o bar.o
Por desgracia, esto no funciona y siempre la función original f se llama en lugar de mi versión envuelta __wrap__Z1fIiEvT_. ¿Ves algún error que haya cometido?
Editado: Como estaba previsto, añado la salida de nm aquí para asegurarse de que el que no he hecho ningún error con el nombre revuelto de la función de plantilla:
$ g++ -c bar.cpp -o bar.o
$ nm bar.o
0000000000000000 W _Z1fIiEvT_
Verifique que está llamando a la función decorada correcta utilizando 'nm' o una herramienta similar. Agregar el resultado relevante de eso a la pregunta puede ser útil. – uesp
No debería f (42); ser f (42)? –
@ Fire-Dragon-DoL - Las funciones de la plantilla inferirán sus tipos de argumentos a partir de los argumentos, y dado que int es el tipo de un entero entero no decorado, esto funciona bien. Si f fuera una clase, entonces el argumento de la plantilla debería ser explícito. – Marc