получение ошибки: использование необъявленного идентификатора ‘__stl_hash_string’ {return __stl_hash_string (__s.c_str ()); }

Я получаю ошибку

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 >

дал мне ошибку во второй строке, говоря, что этот заголовок не может быть включен. Я не уверен, что этот метод устарел в новой среде, если он устарел, то каков альтернативный метод. Я прошу вашей помощи в решении этой проблемы.

1

Решение

Похоже, эта функция определена в libstdc ++. Эта библиотека была по умолчанию в Xcode 3.5, теперь Xcode использует libc ++ по умолчанию. Но вы все равно можете переключить его на libstdc ++ в C++ Standard Library Построить настройки.
Но если вы можете использовать C ++ 11 в своем проекте, я предлагаю вам использовать стандартные станд :: хэш Функция для строки и не полагаться на внутренние функции STD.

1

Другие решения

Ну, я изменил свой заголовочный файл НЕ для использования этого определения поддержки хеша, когда мы используем 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 / не поможет, поскольку этот код используется совместно много продуктов. поэтому не может поставить абсолютные пути заголовка.

0

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
0
По вопросам рекламы [email protected]