получение ошибки error: использование необъявленного идентификатора '__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 >

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


person balumohan    schedule 28.04.2013    source источник


Ответы (2)


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

person cody    schedule 29.04.2013
comment
Спасибо за ответ. Да, мы используем libc++ CXX=clang++ CXXFLAGS='-stdlib=libc++' Знаете ли вы эквивалентную функцию std::hash для __stl_hash_string ?? - person balumohan; 30.04.2013
comment
Возможно, вам следует попробовать добавить путь «/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1/» в заголовок Пути поиска тогда? - person cody; 30.04.2013
comment
Неважно, этот ответ был для вашего комментария до того, как вы его отредактировали. - person cody; 30.04.2013
comment
Вы используете С++11? Если это так, вам не нужны никакие хэш-функции ручной работы, все они уже существуют. - person cody; 30.04.2013

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

person balumohan    schedule 30.04.2013