Ввод запятых между объявлениями шаблона указывает компилятору ожидать двух параметров шаблона.В вашем случае, потому что объект является объектом шаблона, когда вы объявляете функцию, как вы делаете, вы нарушаете свое собственное объявление.Он ищет второй шаблон в объекте MyClass
, ссылается на фактическое объявление класса и понимает, что это ошибка.
Следовательно,
template<typename T, typename V>
struct Foo{
void bar();
};
template<typename T, typename V>
void Foo<T,V>::bar(){...}
- это то, что он ожидает увидеть.
template<typename T>
struct Foo{
void bar();
}
template<typename T, typename V>
void Foo<T>::bar(){...}
- ошибка.Интересно, откуда появился этот другой параметр шаблона.
Если вы хотите сделать это, вам нужно написать функцию прямо здесь:
template<typename T>
struct Foo{
template<typename V>
void bar(const V& _anInputValue){
cout << _anInputValue;
}
void baz();
};
template<typename T>
void Foo<T>::baz(){
cout << "Another function.";
}