Компилятор уже говорит вам ответ. Класс C
является шаблоном с одним параметром, а функция-член f
является функцией-шаблоном, и вы должны определить ее так же:
template <class X>
template <class Y>
void C<X>::f(Y y)
{
// Something.
}
Если вы определите функцию на сайте объявления, вы неявно объявите ее inline
; это практически единственная разница. Конечно, могут быть стилистические соображения, например, никогда не помещать определения функций в определения классов.
Как вы правильно заметили, вам все равно придется предоставить определение в заголовочном файле, поскольку вам нужно будет создавать экземпляр шаблона всякий раз, когда вы его используете, и, таким образом, вам нужен доступ ко всем определениям.