在模板类成员函数入参中使用回调函数指针

来源:互联网 发布:umeng移动端数据统计 编辑:程序博客网 时间:2024/05/22 15:24

在一个普通类中, 成员函数使用了一个回调函数指针作为入参.

将普通类改成模板类后, 编译不过. 后来才明白, 原来应该将typedef声明在类内部.


原始普通类

/// 前向声明class CAvlNode;class CAvl;typedef bool (*PFN_CALLBACK_TRAVERSETREE_TREE)(CAvl* pTree, const CAvlNode*& pNodeOpt);

class CAvl {public:    CAvl() : m_pRoot(NULL), m_nNodeCounter(0) {}    virtual ~CAvl() {free(m_pRoot);}    /// ...    /// 用非递归实现遍历, 由回调操作遍历到的节点    void TraverseDLR(CAvlNode* pTreeNode, PFN_CALLBACK_TRAVERSETREE_TREE pfnCb); ///< 前序    void TraverseLDR(CAvlNode* pTreeNode, PFN_CALLBACK_TRAVERSETREE_TREE pfnCb); ///< 中序    void TraverseLRD(CAvlNode* pTreeNode, PFN_CALLBACK_TRAVERSETREE_TREE pfnCb); ///< 后序};


编译过的模板类

template<class T>class CAvl {public:    CAvl() : m_pRoot(NULL), m_nNodeCounter(0) {}    virtual ~CAvl() {free(m_pRoot);}    /// ...    /// 回调函数需要的声明, 必须在类模板内部定义    typedef bool (*PFN_CALLBACK_TRAVERSETREE_TREE)(CAvl<T>* pTree, const CAvlNode<T>*& pNodeOpt);        /// 用非递归实现遍历, 由回调操作遍历到的节点    void TraverseDLR(CAvlNode<T>* pTreeNode, PFN_CALLBACK_TRAVERSETREE_TREE pfnCb); ///< 前序    void TraverseLDR(CAvlNode<T>* pTreeNode, PFN_CALLBACK_TRAVERSETREE_TREE pfnCb); ///< 中序    void TraverseLRD(CAvlNode<T>* pTreeNode, PFN_CALLBACK_TRAVERSETREE_TREE pfnCb); ///< 后序    void free(CAvlNode<T>* pTreeNode); ///< 释放资源private:    CAvlNode<T>* m_pRoot;    size_t m_nNodeCounter; ///< 树结点计数器, 代表树节点总数};





0 0
原创粉丝点击