2016-07-25 1 views
1

J'essaie d'écrire une classe qui définit un std::map. Le comparateur de la carte doit être un pointeur de fonction. Le pointeur de fonction peut être passé à la classe en tant qu'argument dans le constructeur de la classe.Les variables n'ont pas de type de classe, même si elles sont définies

est Ci-dessous le code que j'ai écrit:

#include <iostream> 
#include <map> 
#include <string> 
#include <functional> 

typedef std::function<bool(std::string x, std::string y)> StrComparatorFn; 

bool FnComparator(std::string x, std::string y) { 
    return strtoul(x.c_str(), NULL, 0) < strtoul(y.c_str(), NULL, 0); 
} 

class MyClass { 
public: 
    MyClass(StrComparatorFn fptr):fn_ptr(fptr){}; 

    void Insert() { 
    my_map.insert(std::pair<std::string, std::string>("1", "one")); 
    my_map.insert(std::pair<std::string, std::string>("2", "two")); 
    my_map.insert(std::pair<std::string, std::string>("10", "ten")); 
    } 

    void Display() { 
    for (auto& it : my_map) { 
     std::cout << it.first.c_str() << "\t => " << it.second.c_str() << "\n"; 
    } 
    } 
private: 
    StrComparatorFn fn_ptr; 
    std::map<std::string, std::string, StrComparatorFn> my_map(StrComparatorFn(fn_ptr)); 
}; 

int main() { 
    MyClass c1(&FnComparator); 
    c1.Insert(); 
    c1.Display(); 
} 

Je reçois une erreur de compilation dans Insert:

error: '((MyClass*)this)->MyClass::my_map' does not have class type 
my_map.insert(std::pair<std::string, std::string>("1", "one")); 

Toute solution à ce problème?

Répondre

2

Cette ligne

std::map<std::string, std::string, StrComparatorFn> my_map(StrComparatorFn(fn_ptr)); 

a un problème connu sous le nom l'analyse syntaxique le plus contrariant. En fait, tout ce qui peut être interprété en fonction, sera:

Foo f(); //f is a function! Not a variable 

Dans votre cas, my_map est analysé en fonction déclarée sans définition. L'utilisation d'accolades au lieu d'accolades courbes résoudra le problème, car l'initialisation de la liste ne peut jamais être interprétée comme une fonction:

std::map<std::string, std::string, StrComparatorFn> my_map{ StrComparatorFn(fn_ptr) }; 
+0

Merci beaucoup. Fonctionne comme un charme !! – VinK