必须调用对非静态功能的引用

Reference to non-static function must be called

本文关键字:功能 引用 静态 调用      更新时间:2023-10-16

我试图声明Priority_queue:

std::priority_queue<int, std::vector<int>, std::function<bool(int, int)>> m_openList;

我用来初始化它的方式是:

m_openList = std::priority_queue<int, std::vector<int>, std::function<bool(int,int)>>(keyCompare);

keycompare是一个函数:

bool PathPlanManager::keyCompare(int pointer1, int pointer2) {
    return m_mapNode[pointer1] > m_mapNode[pointer2];}

,但这似乎是错误的。顺便说一句,我该如何清除此Priority_queue?

尝试后,我的代码就是这样:

class PathPlanManager {
public:
class KeyCompare {
    public:
        KeyCompare(PathPlanManager& manager) : m_manager(&manager){}
        bool operator() (int pointer1, int pointer2) {
            return m_manager->m_nodeMap[pointer1] < m_manager->m_nodeMap[pointer2];
        }
    private:
    PathPlanManager* m_manager;
    };
    void init() {
        m_nodeMap.resize(100);
        for (int i = 0; i < 100; i++) {
            m_nodeMap[i] = 100 - i;
        }
        m_openList = std::priority_queue<int, std::vector<int>, KeyCompare>();
    }
private:
    vector<int> m_nodeMap;
    std::priority_queue<int, std::vector<int>, KeyCompare> m_openList;
};

当我尝试构建它时,有一个错误说没有匹配的构造函数来初始化'value_compare'(aka'pathplanmanager :: keycompare')

KeyCompare需要一个 PathPlanManager的对象:

class PathPlanManager {
public:
    class KeyCompare {
    public:
        KeyCompare(PathPlanManager& manager) : m_manager(&manager) { }
        bool operator()(int pointer1, int pointer2) {
            return m_manager->m_mapNode[pointer1] > m_manager->m_mapNode[pointer2];
        }
    private:
        PathPlanManager* m_manager;
    };
private:
    std::vector<int> m_mapNode;
    typedef std::priority_queue<int, std::vector<int>, KeyCompare> mypq_type;
    mypq_type m_openList;
}

示例用法:

PathPlanManager mgr; // somewhere this is initialised
...
// want to sort some entries according to mgr
std::vector<int> entries{ 0, 13, 37, 42 };
std::sort(entries.begin(), entries.end(), PathPlanManager::KeyCompare(mgr));
// now entries is sorted according to mgr

看到您的更新后:如果要使用priority_map作为类的成员(我们称其为Planner),则可以这样做:

class Planner {
public:
    Planner(PathPlanManager& mgr);
private:
    std::priority_queue<int, std::vector<int>, PathPlanManager::KeyCompare> m_openList;
}
Planner::Planner(PathPlanManager& mgr)
 : m_openList(PathPlanManager::KeyCompare(mgr))
 { }
// Usage:
...
PathPlanManager mgr;
Planner planner(mgr);
...