Я пытаюсь обернуть функцию шаблона с помощью компоновщика GNU wrap вариант. Код выглядит следующим образом:Wrapping C++ template function
// 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
К сожалению, это не работает, и всегда исходной функции е называется вместо моего завернутая версия __wrap__Z1fIiEvT_. Вы видите какие-то ошибки, которые я сделал?
Отредактировано: Как указывалось я прилагаю выход нм здесь, чтобы убедиться, что я не сделал ни одной ошибки с искаженной именем функции шаблона:
$ g++ -c bar.cpp -o bar.o
$ nm bar.o
0000000000000000 W _Z1fIiEvT_
Двойная проверка, что вы вызываете правильную украшенную функцию с помощью 'nm' или аналогичного инструмента. Добавление полезного результата из этого вопроса может оказаться полезным. – uesp
Не должно f (42); be f (42)? –
@ Fire-Dragon-DoL - функции шаблона выведут их аргументы из аргументов, а так как int - это тип в противном случае неапорированного целочисленного литерала, это отлично работает. Если f - класс, то аргумент шаблона должен быть явным. – Marc