Kiedy mijam funkcji szablonu jako parametr szablonu z klasy bazowej, łącznik narzeka, że nie można łączyć funkcji:Komunikat o błędzie „niezdefiniowana odniesienia do funkcji szablonu przekazanego jako parametr szablonu”
#include <stdio.h>
template<int I> inline int identity() {return I;}
//template<> inline int identity<10>() {return 20;}
template<int (*fn)()>
class Base {
public:
int f() {
return fn();
}
};
template<int Val>
class Derived : public Base<identity<10> > {
public:
int f2() {
return f();
}
};
int main(int argc, char **argv) {
Derived<10> o;
printf("result: %d\n", o.f2());
return 0;
}
Skutkuje :
$ g++ -o test2 test2.cpp && ./test2
/tmp/ccahIuzY.o: In function `Base<&(int identity<10>())>::f()':
test2.cpp:(.text._ZN4BaseIXadL_Z8identityILi10EEivEEE1fEv[_ZN4BaseIXadL_Z8identityILi10EEivEEE1fEv]+0xd): undefined reference to `int identity<10>()'
collect2: error: ld returned 1 exit status
Jeśli skomentuję specjalizację, kod kompiluje i łączy zgodnie z oczekiwaniami. Ponadto, jeśli dziedziczy po Base<identity<Val> >
zamiast Base<identity<10> >
, kod działa tak, jak oczekuję.
Spróbuj tutaj: http://coliru.stacked-crooked.com/a/9fd1c3aae847aaf7
Czego brakuje?
Problem ten wydaje się być gcc bug: kompiluje i łączy OK za pomocą szczęk i ICC. BTW, nazwa _identity() _ jest zwykle używana do transformacji, gdy wynik jest identyczny z argumentem. –
@ DietmarKühl No cóż, 'identity()' zwraca 'X'. :-) –
melpomene
Sposób obejścia: 'klasa Pochodna: publiczna baza (tożsamość <10>)>'. [live demo] (http://melpon.org/wandbox/permlink/E4aRHqcZaac7vd3C) –