SalesMap.h摘录 -
typedef BST<Sales> BinarySearchTree;//type defined for Sales_Map construction
typedef map<Date, BinarySearchTree> sales_map;//type defined for map construction
sales_map Sales_Map;
SalesMap.cpp摘录 -
最高和SetHigh都是公开的
void SalesMap::Highest(){
void (SalesMap::*SetHighPTR)(Sales);//create non-static function pointer
SetHighPTR = &SalesMap::SetHigh; //assign address of function void SetHigh(Sales sales)
//it is an iterator to a specific element in Sales_Map
it->second.InSearch(&SetHighPTR); // pass SetHigh into BST object function InSearch
}
void SalesMap::SetHigh(Sales sales)//test input sales object against global highprice variable
{
double price = sales.GetPrice();
if(price < high)
high = price;
}
BST.h
Public:
void InSearch(void (*f)(T) );//calls recursive InSearch function
Private:
void InSearch(node*& leaf, void (*f)(T) );
template <class T>//public InSearch
void BST<T>::InSearch( void (*f)(T) )
{
InSearch(root, (*f));
}
template <class T>//Private InSearch
void BST<T>::InSearch(node*& leaf, void (*f)(T))
{
if(leaf != NULL)
{
InSearch(leaf->left);
(*f)(key);
InSearch(leaf->right);
}
}
我试图在BST.h中创建一个回调函数。我一直收到以下错误:
error C2664: 'void BST<T>::InSearch(void (__cdecl *)(T))' : cannot convert parameter 1 from 'void (__thiscall SalesMap::* )(Sales)' to 'void (__cdecl *)(T)'
我不确定这个问题所需的正确语法,也无法弄清楚我应该做什么以及在哪里做。任何帮助,将不胜感激
问题基本上是你试图将成员函数指针转换为函数指针,这在C ++中根本不可能,因为成员函数指针总是需要一个被调用它的对象。 (this
需要指向某处)
类的静态方法不需要任何对象,因此也是函数指针。
如果要使用成员函数指针,则InSearch
方法应具有以下参数:
template <class T>//public InSearch
void BST<T>::InSearch( void (SalesMap::*f)(T) )
那么你需要一个SalesMap
类型的对象或任何派生类来调用这个方法:
//Using an object pointer
(mySalesObjectPtr->*f)(key);
//No pointer
(mySalesObject.*f)(key);
当然,您可以为函数指针创建一个重载,就像您已经完成的那样,它适用于全局函数和静态方法。
this article的开头很好地概述了这两种类型的函数指针。
当您想要从成员类外部传递成员函数的函数指针时,这是一个基本示例。
class A
{
private:
void(A::*m_myFuncPointer)(); ///declaring a private member function pointer
public:
void init( void(A::*someFunc)() ){
m_myFuncPointer = someFunc; ///stores the function pointer
(this->*m_myFuncPointer)(); ///calls the function using member function
}
void execute(){
std::cout<<"hello"<<std::endl;
}
};
int main()
{
A a;
a.init(&A::execute);
}