Шаблонный метод класса template

#c #templates

#c #шаблоны

Вопрос:

У меня есть это объявление в моем заголовочном файле:

 template<class T>
class list {
protected:
    struct Node{...}
public:
...
template<typename Predicate>
Node* find_if(const Predicateamp; pred);
...
};
 

И после объявления класса у меня есть определение метода find_if (в том же файле):

 template<class T, typename Predicate>
typename list<T>::Node* list<T>::find_if(const Predicateamp; pred) {...}
 

Но компилятор MSVC «не может сопоставить определение функции с существующим объявлением»
Почему мое определение метода неверно?
Спасибо за помощь

Комментарии:

1. Это должно быть template<class T> template <typename Predicate> typename list<T>::Node* list<T>::find_if(const Predicateamp; pred) {...} т.е. Вы должны повторить вложенные шаблоны во внешнем определении.

Ответ №1:

Для вложенных шаблонов и внешнего определения подход OP неверен.

Правильно:

 template<class T>
template <typename Predicate>
typename list<T>::Node* list<T>::find_if(const Predicateamp; pred) { ... }
 

Т.е. каждый шаблон должен быть написан отдельно.

ДЕМОНСТРАЦИЯ:

 template<class T>
class list {
protected:
    struct Node { };
public:

  template<typename Predicate>
  Node* find_if(const Predicateamp; pred);

};

#if 0 // OPs attempt: Syntax error.

template<class T, typename Predicate>
typename list<T>::Node* list<T>::find_if(const Predicateamp; pred);

#else // Correct:

template<class T>
template <typename Predicate>
typename list<T>::Node* list<T>::find_if(const Predicateamp; pred) { return nullptr; }

#endif // 0

int main()
{
  list<int> intList;
}
 

Живая демонстрация на coliru

Ответ №2:

Простой способ увидеть, что ваше определение не может быть правильным, заключается в том, что вы не объявили ни одного шаблона с двумя параметрами. Правильный синтаксис

 template <class T>
template <typename Predicate>
typename list<T>::Node* list<T>::find_if(const Predicateamp; pred) {}