我试着用GNU的链接器包装选项来包装模板函数。代码如下所示:包装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();
}
上面显示的代码是用下面的命令链接:
g++ -Xlinker -wrap=_Z1fIiEvT_ -o test test.o bar.o
不幸的是,这并不工作,始终原有功能˚F被调用,而不是我的包装版本__wrap__Z1fIiEvT_。你看到我犯过的错误吗?
编辑:诚如,我附上纳米这里输出,以确保我没有做任何的失误与模板函数的重整名称:
$ g++ -c bar.cpp -o bar.o
$ nm bar.o
0000000000000000 W _Z1fIiEvT_
仔细检查您是否使用'nm'或类似工具调用了正确的装饰函数。将相关输出添加到问题中可能会有所帮助。 – uesp 2012-01-17 15:57:00
不应该f(42);是f(42)? –
2012-01-20 18:34:54
@ Fire-Dragon-DoL - 模板函数将从参数中推断它们的参数类型,并且由于int是另外一个未修饰的整数文字的类型,所以这可以正常工作。如果f是一个类,那么模板参数需要是明确的。 – Marc 2012-01-20 18:47:40