Я получаю ошибку
error: use of undeclared identifier '__stl_hash_string'
{ return __stl_hash_string( __s.c_str() ); }
при компиляции с использованием Xcode 4.6.1 на Mac OS 10.8.
/——Фрагмент кода ниже —-/
#ifdef __cplusplus
namespace __gnu_cxx
{
template<>
struct hash<std::string>
{
size_t operator()(const std::string& __s) const
{ return __stl_hash_string( __s.c_str() ); }
};
}
#endif
/—————————————/
Этот код прекрасно работал в Xcode 3.5 на Mac OSX 10.7 и 10.6.
Я сделал поиск __stl_hash_string
метод и обнаружил, что его присутствует в папке
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1/ext/hash_fun.h
Однако, когда я написал пример приложения, чтобы посмотреть, смогу ли я включить этот заголовок, это не удалось.
#include < cstddef >
#include < ext/hash_fun.h >
дал мне ошибку во второй строке, говоря, что этот заголовок не может быть включен. Я не уверен, что этот метод устарел в новой среде, если он устарел, то каков альтернативный метод. Я прошу вашей помощи в решении этой проблемы.
Похоже, эта функция определена в libstdc ++. Эта библиотека была по умолчанию в Xcode 3.5, теперь Xcode использует libc ++ по умолчанию. Но вы все равно можете переключить его на libstdc ++ в C++ Standard Library
Построить настройки.
Но если вы можете использовать C ++ 11 в своем проекте, я предлагаю вам использовать стандартные станд :: хэш Функция для строки и не полагаться на внутренние функции STD.
Ну, я изменил свой заголовочный файл НЕ для использования этого определения поддержки хеша, когда мы используем libc ++
/
/ ---------------------------------------------------------------------------
// • hash function support
// ---------------------------------------------------------------------------
#ifdef _LIBCPP_VERSION
/*std::hash available in libc++ so no hash support required*/
#elif __cplusplus
namespace __gnu_cxx
{
template<>
struct hash<std::string>
{
size_t operator()(const std::string& __s) const
{ return __stl_hash_string( __s.c_str() ); }
};
}
#endif
Спасибо Коди за ваш ответ. Теперь это хорошо компилируется. Однако добавление ‘/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/ SDKs / MacOSX10.8.sdk / usr / include / c ++ / 4.2.1 / не поможет, поскольку этот код используется совместно много продуктов. поэтому не может поставить абсолютные пути заголовка.
I have modified the code again so that there won't be any issues for any other clients using this header for the hash functionality.
// ---------------------------------------------------------------------------
// • hash function support
// ---------------------------------------------------------------------------
//
#ifdef _LIBCPP_VERSION
template<>
struct hash<std::string>
{
size_t operator()(const std::string& __s) const
{
std::hash<std::string> hash_fn;
return hash_fn(__s);
}
};
#elif __cplusplus
namespace __gnu_cxx
{
template<>
struct hash<std::string>
{
size_t operator()(const std::string& __s) const
{ return __stl_hash_string( __s.c_str() ); }
};
}
#endif