C++ syntax for explicit specialization of a template function in a template class?

c++, gcc, templates

Solution

You can't specialize a member function without explicitly specializing the containing class. What you can do however is forward calls to a member function of a partially specialized type:

template<class T, class Tag>
struct helper {
    static void f(T);   
};

template<class T>
struct helper<T, tag1> {
    static void f(T) {}
};

template<class T>
struct C {
    // ...
    template<class Tag>
    void foo(T t) {
        helper<T, Tag>::f(t);
    }
};

Problem

I have code which works in VC9 (Microsoft Visual C++ 2008 SP1) but not in GCC 4.2 (on Mac): ``` struct tag {}; template< typename T > struct C { template< typename Tag > void f( T ); // declaration only template<> inline void f< tag >( T ) {} // ERROR: explicit specialization in }; // non-namespace scope 'structC<T>' ``` I understand that GCC would like me to move my explicit specialization outside the class but I can't figure out the syntax. Any ideas? ``` // the following is not correct syntax, what is? template< typename T > template<> inline void C< T >::f< tag >( T ) {} ```

Original source