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) {}