C++ 模板类的模板方法

C++ 模板类的模板方法,c++,templates,C++,Templates,我的头文件中有以下声明: template<class T> class list { protected: struct Node{...} public: ... template<typename Predicate> Node* find_if(const Predicate& pred); ... }; 模板 班级名单{ 受保护的: 结构节点{…} 公众: ... 模板 节点*find_if(const谓词和pred); ... }; 在类声

我的头文件中有以下声明:

template<class T>
class list {
protected:
    struct Node{...}
public:
...
template<typename Predicate>
Node* find_if(const Predicate& pred);
...
};
模板
班级名单{
受保护的:
结构节点{…}
公众:
...
模板
节点*find_if(const谓词和pred);
...
};
在类声明之后,我找到了_if方法定义(在同一个文件中):

模板
typename list::Node*list::find_if(const谓词和pred){…}
但MSVC编译器“无法将函数定义与现有声明匹配” 为什么我的方法定义是错误的?
感谢您对嵌套模板和外部定义的帮助,OP的方法不正确

正确答案是:

template<class T>
template <typename Predicate>
typename list<T>::Node* list<T>::find_if(const Predicate& pred) { ... }
模板
模板
typename list::Node*list::find_if(const谓词和pred){…}
即,每个模板必须单独编写

演示:

模板
班级名单{
受保护的:
结构节点{};
公众:
模板
节点*find_if(const谓词和pred);
};
#如果0//OPs尝试:语法错误。
模板
typename list::Node*list::find_if(const谓词&pred);
#else//正确:
模板
模板
typename list::Node*list::find_if(const谓词&pred){return nullptr;}
#endif//0
int main()
{
列表intList;
}

要想知道您的定义不正确,最简单的方法是您没有声明任何带有两个参数的模板。正确的语法是

template <class T>
template <typename Predicate>
typename list<T>::Node* list<T>::find_if(const Predicate& pred) {}
模板
模板
typename list::Node*list::find_if(const谓词&pred){

必须是
模板模板typename list::Node*list::find_if(const Predicate&pred){…}
也就是说,您必须在外部定义中重复嵌套模板。谢谢,这很有效!
template<class T>
class list {
protected:
    struct Node { };
public:

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

};

#if 0 // OPs attempt: Syntax error.

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

#else // Correct:

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

#endif // 0

int main()
{
  list<int> intList;
}
template <class T>
template <typename Predicate>
typename list<T>::Node* list<T>::find_if(const Predicate& pred) {}