2016-06-27 7 views
-2

ich versucht, einen priority_queue zu erklären:Verweis auf nicht-statische Funktion muss aufgerufen werden,

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

und die Art, wie ich es verwenden, zu initialisieren ist:

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

keyCompare ist eine Funktion:

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

Aber es scheint falsch. BTW, wie kann ich diese priority_queue löschen?

Nachdem ich versuchte, mein Code wie folgt war:

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; 
}; 

Und wenn ich es zu bauen versuchte, es ist ein Fehler, sagt kein passender Konstruktor zur Initialisierung von ‚value_compare‘ (auch bekannt als ‚PathPlanManager :: KeyCompare ‚)

+1

PathPlan :: KeyCompare :: operator () ist eine Funktion, die zur PathPlan :: KeyCompare-Struktur gehört, daher kann sie nicht auf das private Mitglied von PathPlan zugreifen, da sie ein anderes Objekt sind. – Krapow

+0

Nein, das Problem ist immer noch hier, wenn ich Vektor m_nodeMap als öffentlich setzen –

+0

Ja, weil Sie in Betracht ziehen, dass KeyCompare direkten Zugriff auf PathPlan hat. Oder hat es nicht. Sie können eine statische Variable von KeyCompare festlegen, die Zugriff auf die Instanz von PathPlan hat, die Sie beispielsweise sortieren möchten. – Krapow

Antwort

0

KeyCompare braucht ein Objekt von 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; 
} 

Beispiel Nutzung:

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 

nach dem Update zu sehen: Wenn Sie priority_map als Mitglied einer Klasse verwendet werden soll (wir es Planner nennen) Sie es wie folgt tun:

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); 
... 
+0

Ich folge Ihrem Weg und es zeigt einen Fehler: Kein passender Konstruktor für die Initialisierung von KeyCompare –

+0

@YunfeiLu Ich fügte ein Verwendungsbeispiel hinzu, posten Sie Ihre vollständige Fehlermeldung und den Code, wo der Fehler aufgetreten ist. – BeyelerStudios

+0

Ich habe die Frage aktualisiert. –

Verwandte Themen