收到错误错误:使用未声明的标识符'__stl_hash_string'{return __stl_hash_string(__s.c_str()); }

时间:2013-04-28 08:19:28

标签: c++ macos osx-mountain-lion xcode4.6

我收到错误

error: use of undeclared identifier '__stl_hash_string'
                    { return __stl_hash_string( __s.c_str() ); }

在Mac OS 10.8上使用Xcode 4.6.1进行编译。

/ ------下面的代码片段---- /

#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

/ -------------------------------------- / 这段代码在Mac OSX 10.7和10.6上的Xcode 3.5中运行得非常好。

我搜索了__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 >

在第二行给了我错误,说这个标题不能包括在内。我不确定这种方法是否在新环境中被弃用,如果不推荐使用,那么替代方法是什么。我请求你帮忙解决这个问题。

3 个答案:

答案 0 :(得分:1)

看起来这个函数在libstdc ++中定义。这个库在Xcode 3.5中是默认的,现在Xcode默认使用libc ++。但您仍然可以在C++ Standard Library构建设置中将其切换到libstdc ++ 但是如果您可以在项目中使用C ++ 11,我建议您使用标准std::hash函数字符串,而不是依赖于内部std函数。

答案 1 :(得分:0)

我使用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 /不会帮助因为这个代码共享很多产品。所以无法放置绝对标头路径。

答案 2 :(得分: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