When I pass a template function as a template parameter of a base class, the linker complains that it cannot link the function:
#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; } Results in:
$ 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 If I comment out the specialization, then the code compiles and links as expected. Also, if I inherit from Base<identity<Val> > instead of Base<identity<10> >, the code works as I expect.
Try here: http://coliru.stacked-crooked.com/a/9fd1c3aae847aaf7
What do I miss?
identity<X>()returnsX. :-)class Derived : public Base<static_cast<int(*)()>(identity<10>) >. live demo