error: 函數調用缺少參數列表;請使用“&BinTree::_PrintNode”創建指向成員的指針

在寫二叉樹的遍歷時,錯誤代碼代碼如下:

class BinTree
{
public:
    typedef void(*pFun)(pNode);
    void PreVisit()
    {
        _PreVisit(_pRoot,_PrintNode);
    }
protected:
    void _PrintNode(pNode pd)
    {
        cout << pd->_data << endl;
    }

    void _PreVisit(pNode pd,pFun pf)
    {
        if (_pRoot)
        {
            pf(_pRoot);
            _PreVisit(_pRoot->_left,pf);
            _PreVisit(_pRoot->_right,pf);
        }       
    }
private:
    pNode _pRoot;
};

錯誤原因:
靜態成員函數的地址可用普通函數指針儲存,而普通成員函數地址需要用類成員函數指針來儲存,因爲普通成員函數要執行時我們必須要確定他是屬於哪個類對象才能執行,而類的static函數是不屬於這個類的,他是在編譯器編譯時期就已經確定的,普通成員函數是在有了類對象之後才能執行。

類的成員函數指針作爲參數傳遞給其他函數和普通函數指針的傳遞是不同的,普通函數指針的傳遞只要在參數聲明中聲明是相同參數個數、類型和相同返回類型的函數指針int (*p)(int),傳遞時只需傳函數名就可以了。可是傳遞成員函數指針用此方法卻不能工作。指針是指向一些內存地址的變量,既可以是數據的地址也可以是函數的地址。C++的 成員指針遵從同樣的原則。但在類內部沒有地址;選擇一個類的成員意味着在類中偏移。只有把這個偏移和具體對象的開始地址結合,才能得到實際地址。成員指針的語法要求選擇一個對象的同時逆向引用成員指針。
當然,可以把成員函數聲明爲static(靜態函數),這樣傳遞它的指針就像傳遞普通函數一樣。

解決方法:
把_PrintNode改爲static函數或非成員函數即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章