#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;
}
Ответ №2:
Простой способ увидеть, что ваше определение не может быть правильным, заключается в том, что вы не объявили ни одного шаблона с двумя параметрами. Правильный синтаксис
template <class T>
template <typename Predicate>
typename list<T>::Node* list<T>::find_if(const Predicateamp; pred) {}