Bonjour

J'aurais besoin d'aide pour utiliser le template hash_map de
la STL (extensions GNU sous Linux), car j'ai des bugs de
compilation que je ne parviens pas à résoudre.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
struct pair {
    char* nom;
    char* definition;
};
 
pair dico[] = {
    { "alumette", "instrument pour allumer du feu" },
    { "cheval", "quadrupède servant à la monte" },
    { "bateau", "moyen de transport aquatique" },
    { "carte", "bout de papier" },
    { "doigt", "extrémité de la main" },
    { "essai", "application d'un acte dont on ignore s'il peut réussir" },
    { "gratuit", "qu'il ne faut pas payer" },
    { "histoire", "récit d'événements réels ou fictifs" },
};
 
struct eqstr
{
    bool operator()(char *s1, char *s2)
    {
        return strcmp(s1, s2) == 0;
    }
};
 
int main(int argc, char **argv)
{
    __gnu_cxx::hash_map<char*, char*, __gnu_cxx::hash<char*>, eqstr> h;
    int i;
 
    for (i=0; i<=7; i++) {
        h.insert(dico[i].nom, dico[i].definition);
    }
 
    cout << h.find("essai")->second << endl;
 
    return 0;
}
Résultat de la compilation :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
$ g++ -o test test.cpp
/usr/include/c++/3.3/ext/stl_hashtable.h: Dans member function « void
   __gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey,
   _Alloc>::insert_unique(_ForwardIterator, _ForwardIterator,
   std::forward_iterator_tag) [with _ForwardIterator = char*, _Val =
   std::pair<char* const, char*>, _Key = char*, _HashFcn =
   __gnu_cxx::hash<char*>, _ExtractKey = std::_Select1st<std::pair<char* const,
   char*> >, _EqualKey = eqstr, _Alloc = std::allocator<char*>] »:
/usr/include/c++/3.3/ext/stl_hashtable.h:394:   instantiated from `void __gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::insert_unique(_InputIterator, _InputIterator) [with _InputIterator = char*, _Val = std::pair<char* const, char*>, _Key = char*, _HashFcn = __gnu_cxx::hash<char*>, _ExtractKey = std::_Select1st<std::pair<char* const, char*> >, _EqualKey = eqstr, _Alloc = std::allocator<char*>]'
/usr/include/c++/3.3/ext/hash_map:174:   instantiated from `void __gnu_cxx::hash_map<_Key, _Tp, _HashFcn, _EqualKey, _Alloc>::insert(_InputIterator, _InputIterator) [with _InputIterator = char*, _Key = char*, _Tp = char*, _HashFcn = __gnu_cxx::hash<char*>, _EqualKey = eqstr, _Alloc = std::allocator<char*>]'
test.cpp:37:   instantiated from here
/usr/include/c++/3.3/ext/stl_hashtable.h:426: error: no matching function for
   call to `__gnu_cxx::hashtable<std::pair<char* const, char*>, char*,
   __gnu_cxx::hash<char*>, std::_Select1st<std::pair<char* const, char*> >,
   eqstr, std::allocator<char*> >::insert_unique_noresize(char&)'
/usr/include/c++/3.3/ext/stl_hashtable.h:654: error: candidates are:
   std::pair<__gnu_cxx::_Hashtable_iterator<_Val, _Key, _HashFcn, _ExtractKey,
   _EqualKey, _Alloc>, bool> __gnu_cxx::hashtable<_Val, _Key, _HashFcn,
   _ExtractKey, _EqualKey, _Alloc>::insert_unique_noresize(const _Val&) [with
   _Val = std::pair<char* const, char*>, _Key = char*, _HashFcn =
   __gnu_cxx::hash<char*>, _ExtractKey = std::_Select1st<std::pair<char* const,
   char*> >, _EqualKey = eqstr, _Alloc = std::allocator<char*>]