The following code:
template <typename S, typename T> struct foo { void bar(); }; template <typename T> void foo <int, T>::bar() { }
gives me the error
invalid use of incomplete type 'struct foo<int, T>' declaration of 'struct foo<int, T>'
(I’m using gcc.) Is my syntax for partial specialization wrong? Note that if I remove the second argument:
template <typename S> struct foo { void bar(); }; template <> void foo <int>::bar() { }
then it compiles correctly.
You can’t partially specialize a function. If you wish to do so on a member function, you must partially specialize the entire template (yes, it’s irritating). On a large templated class, to partially specialize a function, you would need a workaround. Perhaps a templated member struct (e.g.
template <typename U = T> struct Nested) would work. Or else you can try deriving from another template that partially specializes (works if you use thethis->membernotation, otherwise you will encounter compiler errors).