我試着用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