我创建了一个模板化的BST,其功能是收集数据:
typedef void (*func)(T&);
...
template<class T>
void BST<T>::inorderCollectionTraversal(func f) const
{
inorderCollection(root,f);
}
template<class T>
void BST<T>::inorderCollection(node<T> *p, func f) const
{
if(p!=NULL){
inorderCollection(p->leftPtr, f);
f(p->data);
inorderCollection(p->rightPtr, f);
}
}
然后在另一个类中,我尝试使用此数据结构对另一个类的对象进行排序。我无法从BST中提取对象:
map<string, BST<Weather> > dataByMonth;
dataByMonth.find(monthCount[i]+eYear)->second.inorderCollectionTraversal(collectData); // the error points to this line
void Query::collectData(Weather& w){
collector.push_back(w);
}
其他所有测试都没有问题。只有这不起作用。错误消息是:
No matching function for call to 'BST<Weather>::inorderCollectionTraversal(<unresolved overloaded function type>) candidate: void BST<T>::inorderCollectionTraversal(BST<T>::func) const [with T error: no matching function for call to 'BST<MetData>::inorderCollectionTraversal(<unresolved overloaded function type>)'| include\BST.h|235|note: candidate: void BST<T>::inorderCollectionTraversal(BST<T>::func) const [with T = MetData; BST<T>::func = void (*)(MetData&)]| include\BST.h|235|note: no known conversion for argument 1 from '<unresolved overloaded function type>' to 'BST<MetData>::func {aka void (*)(MetData&)}'|
有人可以告诉我哪里出错吗?
答案 0 :(得分:1)
BST::func
被声明为指向独立函数的指针,但是在调用inorderCollectionTraversal(collectData)
时,您试图传递一个类方法。如果collectData()
未声明为static
(您的代码暗示,假设collector
是Query
的非静态成员),那么这将无效,因为{{ 1}}有一个隐含的collectData()
参数,this
在调用时不会填充。
请考虑将func
改为使用std::function
:
func
然后你可以使用lambda来调用std::function<void(T&)> func;
:
collectData()
甚至直接推入...->second.inorderCollectionTraversal([this](Weather &w){ collectData(w); });
:
collector