版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lingdi2000/article/details/54647179
unordermap 错误 invalid use of incomplete type
今天在使用unordermap 保存自定义类型的时候出现了如下的错误:
In file included from /usr/include/c++/4.8/bits/hashtable.h:35:0,
from /usr/include/c++/4.8/unordered_map:47,
from ../include/engine.h:13,
from superserver.h:1,
from ServerTask.cpp:1:
/usr/include/c++/4.8/bits/hashtable_policy.h: In instantiation of 'struct std::__detail::_Hash_code_base<Cmd::Super::ServerEntry, std::pair<const Cmd::Super::ServerEntry, bool>, std::__detail::_Select1st, std::hash<Cmd::Super::ServerEntry>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, true>':
/usr/include/c++/4.8/bits/hashtable_policy.h:1402:10: required from 'struct std::__detail::_Hashtable_base<Cmd::Super::ServerEntry, std::pair<const Cmd::Super::ServerEntry, bool>, std::__detail::_Select1st, std::equal_to<Cmd::Super::ServerEntry>, std::hash<Cmd::Super::ServerEntry>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Hashtable_traits<true, false, true> >'
/usr/include/c++/4.8/bits/hashtable.h:174:11: required from 'class std::_Hashtable<Cmd::Super::ServerEntry, std::pair<const Cmd::Super::ServerEntry, bool>, std::allocator<std::pair<const Cmd::Super::ServerEntry, bool> >, std::__detail::_Select1st, std::equal_to<Cmd::Super::ServerEntry>, std::hash<Cmd::Super::ServerEntry>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >'
/usr/include/c++/4.8/bits/unordered_map.h:100:18: required from 'class std::unordered_map<Cmd::Super::ServerEntry, bool>'
superserver.h:221:12: required from here
/usr/include/c++/4.8/bits/hashtable_policy.h:1070:12: error: invalid use of incomplete type 'struct std::hash<Cmd::Super::ServerEntry>'
struct _Hash_code_base<_Key, _Value, _ExtractKey, _H1, _H2,
^
In file included from /usr/include/c++/4.8/bits/basic_string.h:3033:0,
from /usr/include/c++/4.8/string:52,
from /usr/include/c++/4.8/bits/locale_classes.h:40,
from /usr/include/c++/4.8/bits/ios_base.h:41,
from /usr/include/c++/4.8/ios:42,
from /usr/include/c++/4.8/istream:38,
from /usr/include/c++/4.8/sstream:38,
from ../include/engine.h:6,
from superserver.h:1,
from ServerTask.cpp:1:
/usr/include/c++/4.8/bits/functional_hash.h:58:12: error: declaration of 'struct std::hash<Cmd::Super::ServerEntry>'
struct hash;
^
In file included from /usr/include/c++/4.8/bits/hashtable.h:35:0,
from /usr/include/c++/4.8/unordered_map:47,
from ../include/engine.h:13,
from superserver.h:1,
from ServerTask.cpp:1:
/usr/include/c++/4.8/bits/hashtable_policy.h:1070:12: error: invalid use of incomplete type 'struct std::hash<Cmd::Super::ServerEntry>'
struct _Hash_code_base<_Key, _Value, _ExtractKey, _H1, _H2,
^
In file included from /usr/include/c++/4.8/bits/basic_string.h:3033:0,
from /usr/include/c++/4.8/string:52,
from /usr/include/c++/4.8/bits/locale_classes.h:40,
from /usr/include/c++/4.8/bits/ios_base.h:41,
from /usr/include/c++/4.8/ios:42,
from /usr/include/c++/4.8/istream:38,
from /usr/include/c++/4.8/sstream:38,
from ../include/engine.h:6,
from superserver.h:1,
from ServerTask.cpp:1:
/usr/include/c++/4.8/bits/functional_hash.h:58:12: error: declaration of 'struct std::hash<Cmd::Super::ServerEntry>'
struct hash;
^
In file included from /usr/include/c++/4.8/bits/hashtable.h:35:0,
from /usr/include/c++/4.8/unordered_map:47,
from ../include/engine.h:13,
from superserver.h:1,
from ServerTask.cpp:1:
/usr/include/c++/4.8/bits/hashtable_policy.h:1082:53: error: invalid use of incomplete type 'struct std::hash<Cmd::Super::ServerEntry>'
using __ebo_h1 = _Hashtable_ebo_helper<1, _H1>;
^
In file included from /usr/include/c++/4.8/bits/basic_string.h:3033:0,
from /usr/include/c++/4.8/string:52,
from /usr/include/c++/4.8/bits/locale_classes.h:40,
from /usr/include/c++/4.8/bits/ios_base.h:41,
from /usr/include/c++/4.8/ios:42,
from /usr/include/c++/4.8/istream:38,
from /usr/include/c++/4.8/sstream:38,
from ../include/engine.h:6,
from superserver.h:1,
from ServerTask.cpp:1:
/usr/include/c++/4.8/bits/functional_hash.h:58:12: error: declaration of 'struct std::hash<Cmd::Super::ServerEntry>'
struct hash;
^
In file included from /usr/include/c++/4.8/bits/hashtable.h:35:0,
from /usr/include/c++/4.8/unordered_map:47,
from ../include/engine.h:13,
from superserver.h:1,
from ServerTask.cpp:1:
/usr/include/c++/4.8/bits/hashtable_policy.h:1082:53: error: invalid use of incomplete type 'struct std::hash<Cmd::Super::ServerEntry>'
using __ebo_h1 = _Hashtable_ebo_helper<1, _H1>;
^
In file included from /usr/include/c++/4.8/bits/basic_string.h:3033:0,
from /usr/include/c++/4.8/string:52,
from /usr/include/c++/4.8/bits/locale_classes.h:40,
from /usr/include/c++/4.8/bits/ios_base.h:41,
from /usr/include/c++/4.8/ios:42,
from /usr/include/c++/4.8/istream:38,
from /usr/include/c++/4.8/sstream:38,
from ../include/engine.h:6,
from superserver.h:1,
from ServerTask.cpp:1:
/usr/include/c++/4.8/bits/functional_hash.h:58:12: error: declaration of 'struct std::hash<Cmd::Super::ServerEntry>'
struct hash;
^
ServerTask.cpp: In constructor 'std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type, const hasher&, const key_equal&, const allocator_type&) [with _Key = Cmd::Super::ServerEntry; _Tp = bool; _Hash = std::hash<Cmd::Super::ServerEntry>; _Pred = std::equal_to<Cmd::Super::ServerEntry>; _Alloc = std::allocator<std::pair<const Cmd::Super::ServerEntry, bool> >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type = long unsigned int; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hasher = std::hash<Cmd::Super::ServerEntry>; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_equal = std::equal_to<Cmd::Super::ServerEntry>; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::allocator_type = std::allocator<std::pair<const Cmd::Super::ServerEntry, bool> >]':
ServerTask.cpp:3:133: error: invalid use of incomplete type 'std::unordered_map<Cmd::Super::ServerEntry, bool>::hasher {aka struct std::hash<Cmd::Super::ServerEntry>}'
ServerTask::ServerTask(zTCPTaskPool *tcptaskPool, const SOCKET sock, const struct sockaddr_in *addr) :zTCPTask(tcptaskPool,sock,addr)
^
In file included from /usr/include/c++/4.8/bits/basic_string.h:3033:0,
from /usr/include/c++/4.8/string:52,
from /usr/include/c++/4.8/bits/locale_classes.h:40,
from /usr/include/c++/4.8/bits/ios_base.h:41,
from /usr/include/c++/4.8/ios:42,
from /usr/include/c++/4.8/istream:38,
from /usr/include/c++/4.8/sstream:38,
from ../include/engine.h:6,
from superserver.h:1,
from ServerTask.cpp:1:
/usr/include/c++/4.8/bits/functional_hash.h:58:12: error: declaration of 'std::unordered_map<Cmd::Super::ServerEntry, bool>::hasher {aka struct std::hash<Cmd::Super::ServerEntry>}'
struct hash;
出现这个的原因是:没有给自定义类型设置hash函数,所以需要自己手动写一个。
class MyHash
{
public:
std::size_t operator()(const vector<pair<int,int>> &v) const
{
std::size_t x = 0;
for (auto &i : v)
x ^= std::hash<int>()(i.first) ^ std::hash<int>()(i.second);
return x;
}
};
int main()
{
unordered_set<vector<pair<int,int>>, MyHash> um;
}
还有一种绕过语法错误的方法,就是对于自定义类型保存其指针,由于指针是int型,所以系统默认是支持的,不需要在写hash函数。但是要注意内存泄漏的问题。