У меня есть следующий код C ++:
#include <iostream>
#include <google/dense_hash_map>
#include <string.h>
using google::dense_hash_map; // namespace where class lives by default
using std::cout;
using std::endl;
using std::tr1::hash; // or __gnu_cxx::hash, or maybe tr1::hash, depending on your OS
struct eqstr
{
bool operator()(const char* s1, const char* s2) const
{
return (s1 == s2) || (s1 && s2 && strcmp(s1, s2) == 0);
}
};
int main(void){
dense_hash_map<const int, const char*, hash<const int>, eqstr> months;
months.set_empty_key(0);
months[1234] = "1234";
cout << "1234:" << months[1234] << endl;
}
Как видите, я реализую хеш-таблицу с помощью библиотеки Google sparsehash.
Я использую целые числа в качестве ключа и строки в качестве значения.
Но я продолжаю получать следующую ошибку компиляции, до которой не могу добраться:
сделать все файл сборки: ../src/Main.cpp Вызов: компилятор GCC C ++
g ++ -O0 -g3 -Wall -c -fmessage-length = 0 -MMD -MP -MF "src / Main.d"
-MT "src / Main.d" -o "src / Main.o" "../src/Main.cpp" В файле, включенном из
/ USR / местные / включить / Google / dense_hash_map: 104: 0,
из ../src/Main.cpp:2:
/usr/local/include/google/sparsehash/densehashtable.h: участник
функция ‘bool google :: dens_hashtable :: KeyInfo :: equals (const key_type &,
const key_type &) const [со значением = std :: pair, ключ = int, HashFcn = std :: tr1 :: hash, ExtractKey =
Google :: dense_hash_map,
eqstr> :: SelectKey, SetKey = google :: dens_hash_map, eqstr> :: SetKey, EqualKey = eqstr, Alloc =
Google :: libc_allocator_with_realloc
, key_type = int] ’:
/usr/local/include/google/sparsehash/densehashtable.h:1306:32:
создается из ‘bool google :: dens_hashtable :: equals (const key_type &, const
key_type &) const [со значением = std :: pair, Key
= int, HashFcn = std :: tr1 :: hash, ExtractKey =
Google :: dense_hash_map,
eqstr> :: SelectKey, SetKey = google :: dens_hash_map, eqstr> :: SetKey, EqualKey = eqstr, Alloc =
Google :: libc_allocator_with_realloc
, key_type = int] ’
/usr/local/include/google/sparsehash/densehashtable.h:514:5:
создается из ‘void google :: dens_hashtable :: set_empty_key (google :: dens_hashtable :: const_reference) [with Value =
std :: pair, Key = int, HashFcn =
std :: tr1 :: hash, ExtractKey = google :: dens_hash_map, eqstr> :: SelectKey, SetKey =
Google :: dense_hash_map,
eqstr> :: SetKey, EqualKey = eqstr, Alloc =
Google :: libc_allocator_with_realloc
:
создается из ‘void google :: dens_hash_map :: set_empty_key (google :: dens_hash_map :: key_type &) [с Key = int, T = const
char *, HashFcn = std :: tr1 :: hash, EqualKey = eqstr, Alloc =
Google :: libc_allocator_with_realloc
, google :: dens_hash_map :: key_type
= int] ’../src/Main.cpp:21:25: создается здесь
/usr/local/include/google/sparsehash/densehashtable.h:1293:39: ошибка:
недопустимое преобразование из ‘google :: dens_hashtable, int, std :: tr1 :: hash, google :: dens_hash_map, eqstr,
Google :: libc_allocator_with_realloc
:: SelectKey, eqstr,
Google :: libc_allocator_with_realloc
, google :: dens_hash_map,
eqstr, google :: libc_allocator_with_realloc>> :: SetKey, eqstr,
Google :: libc_allocator_with_realloc
, eqstr, google :: libc_allocator_with_realloc>> :: key_type ’to‘ const char * ’
/usr/local/include/google/sparsehash/densehashtable.h:1293:39: ошибка:
инициализирующий аргумент 1 из ‘bool eqstr :: operator () (const char *, const
char *) const ’
/usr/local/include/google/sparsehash/densehashtable.h:1293:39: ошибка:
недопустимое преобразование из ‘google :: dens_hashtable, int, std :: tr1 :: hash, google :: dens_hash_map, eqstr,
Google :: libc_allocator_with_realloc
:: SelectKey, eqstr,
Google :: libc_allocator_with_realloc
, google :: dens_hash_map,
eqstr, google :: libc_allocator_with_realloc>> :: SetKey, eqstr,
Google :: libc_allocator_with_realloc
, eqstr, google :: libc_allocator_with_realloc>> :: key_type ’to‘ const char * ’
/usr/local/include/google/sparsehash/densehashtable.h:1293:39: ошибка:
инициализирующий аргумент 2 из of bool eqstr :: operator () (const char *, const
char *) const ’make: * [src / Main.o] Ошибка 1
Это кажется очень многословным, и я не могув этом есть смысл.
Я должен добавить, что когда я использую строки в качестве ключа и целые числа в качестве значения, он работает нормально:
dense_hash_map<const char*, int, hash<const char*>, eqstr> months;
...
months["february"] = 2; //works fine
У кого-нибудь есть идеи?
Заранее большое спасибо,
Редактировать: теперь это работает!
#include <iostream>
#include <google/dense_hash_map>
#include <string.h>
using google::dense_hash_map; // namespace where class lives by default
using std::cout;
using std::endl;
using std::tr1::hash; // or __gnu_cxx::hash, or maybe tr1::hash, depending on your OS
struct eqstr
{
bool operator()(int s1, int s2) const
{
return (s1 == s2); //|| (s1 && s2 && strcmp(s1, s2) == 0);
}
};
int main(void){
dense_hash_map<int, const char*, hash<int>, eqstr> months;
months.set_empty_key(0);
months[1234] = "1234";
cout << "1234:" << months[1234] << endl;
}
Полностью забыл о редактировании структуры eqstr для размещения новых типов данных ... Удары вбок