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