2012-04-01 9 views
1

Ich habe den folgenden Code, in dem Boost.Local einen Funktionsrückruf verwendet, um eine Mo-Datei zu laden. Die Funktion heißt findMo für mich, und ich versuche, sie an ein Objekt zu binden, damit ich die Nebenwirkungen behalten kann, die ich privaten Mitgliedern von moFinder gebe.Boost.Bind nicht statische Mitglied

class moFinder 
{ 
    public: 
    moFinder(string const& wantedFormat) 
    : format(wantedFormat) 
    { 
     // ... 
    } 

    std::vector<char> findMo(std::string const& filePath, std::string const& encoding) 
    { 
     // ... 
    } 
}; 

std::locale createLocale(string const& name, string const& customTranslation, 
    string const& path, string const& domain, string const& pathFormat) 
{ 
    // ... 

    namespace blg = boost::locale::gnu_gettext; 
    blg::messages_info info; 
    info.paths.push_back(path); 
    info.domains.push_back(blg::messages_info::domain(domain)); 

    moFinder finder(pathFormat); 

    blg::messages_info::callback_type callbackFunc; 
    callbackFunc = boost::bind(moFinder::findMo, boost::ref(finder)); 

    info.callback = callbackFunc; 

    // ... 
} 

Beim Kompilieren bekomme ich folgende Fehlermeldung:

error: invalid use of non-static member function ‘std::vector moFinder::findMo(const std::string&, const std::string&)’

an der Linie, wo ich boost :: bind nennen.

Was mache ich, um diesen Fehler zu verdienen?

+0

Versuchen Sie, Ihre Probleme auf kleinere Proben zu reduzieren. Nichts hat hier etwas mit 'boost.locale' zu ​​tun. Es ist rein 'bind'. Dies macht die Diagnose viel einfacher. – pmr

+0

tue ich normalerweise, aber ich war ehrlich gesagt nicht sicher, ob es mit Boost zu tun hatte. Lokale Verrücktheit oder nicht. – Jookia

Antwort

5

Ihnen fehlt die Adresse des Operators vor der Mitgliedsadresse: &moFinder::findMo. Darüber hinaus müssen Sie boost::mem_fn verwenden, um die Elementfunktion in ein Funktionsobjekt umzuwandeln, und Sie fehlen die Platzhalter. Alles in allem:

boost::bind(boost::mem_fn(&moFinder::findMo,), boost::ref(finder), _1, _2); 
               // or &finder 
+0

Danke! Ich habe boost :: mem_fn oder die _1, _2s noch nie gesehen, wenn ich bei anderen Beispielen über stackoverflow blicke, habe ich etwas übersehen? – Jookia

+1

@Jookia Die boost.bind-Dokumentation? http://www.boost.org/doc/libs/1_49_0/libs/bind/bind.html;) – pmr