явная специализация шаблонной функции-члена класса - PullRequest
7 голосов
/ 25 сентября 2011

У меня есть это:

template<class T, class U>
class A
{
    template<size_t N>
    void BindValues();
}

template<class T, class U>
template<size_t N>
inline void A<T, U>::BindValues()
{
    conn->setValue<N-1>( std::get<N-1>(m_Tuple) );
    BindValues<N-1>(conn);
}

template<class T, class U>
template<>
inline void A<T, U>::BindValues<1>()
{
    conn->setValue<0>( std::get<0>(m_Tuple) );
}

Моя ошибка компиляции:

invalid explicit specialization before '>' token
enclosing class templates are not explicitly specialized
template-id BindValues<1> for void A<T, U>::BindValues() does not match any template declaration

Ответы [ 2 ]

6 голосов
/ 25 сентября 2011

К сожалению, метод template внутри класса template не может быть специализированным только на основе аргумента template метода.

Вам необходимо специализировать template class также .Другими словами, специализация метода-члена должна быть полной специализацией по отношению к class template (то есть <T,U>) параметрам, а также элементу template params (т.е. <size_t>).

Например, вам, возможно, придется специализировать что-то вроде этого ( demo ):

template<>  // <------ you have to specialize class also
template<>
inline void A<int, double>::BindValues<1>()  // <-------- see A<T,U>
{
    ...
}
3 голосов
/ 25 сентября 2011

То, что вы пытаетесь сделать, - это частичная специализация шаблона для функции, что недопустимо.

Вы можете определить шаблонную функцию на N для шаблонной специализации A (например, A<int, int>::BindValues<N>()), но наоборот не допускается.

...