前几天相中并买下了一本《C++数据结构与算法》,的确是相中了,封面看起来B格就很高,今天把它拿出来抖抖灰,敲了书上P175的一段二叉查找树的代码。突发奇想给遍历成员函数传递一个函数成员指针,用来访问节点数据,并在类内定义成员函数vist,作为默认的访问函数,如下面的BFS遍历,
template <typename T>
void BST<T>::breadthFirst(void(*func)(BSTNode<T> *) = &BST<T>::vist)
{
std::queue<BSTNode<T> *> que;
BSTNode<T> *p = root;
if (p == 0)
return;
que.push(p);
while (!que.empty())
{
p = que.front();
que.pop();
if (p->left)
que.push(p->left);
if (p->right)
que.push(p->right);
func(p);
}
}
//BST::vist
template <typename T>
inline void BST<T>::vist(BSTNode<T> *node)
{
cout << node->val << ' ';
return;
}
结果编译时报错:
错误 1 error C2440: “默认参数”: 无法从“void (__thiscall BST<int>::* )(BSTNode<T> *)”转换为“void (__cdecl *)(BSTNode<T> *)”
话说以前并没有见到过类似报错,在捣鼓了老半天之后,一拍脑门想到:thiscall 和cdecl,是不是少一个static关