https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92770
Bug ID: 92770 Summary: std::unordered_map<T, U> requires both T and U to be fully declared Product: gcc Version: 9.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: raphael.kubo.da.costa at intel dot com Target Milestone: --- $ cat unordered_map.cc #include <unordered_map> struct S; class C { std::unordered_map<S, int> map_; }; $ g++ -std=gnu++14 -c unordered_map.cc In file included from /usr/include/c++/9/unordered_map:43, from unordered_map.cc:1: /usr/include/c++/9/bits/stl_pair.h: In instantiation of ‘struct std::pair<const S, int>’: /usr/include/c++/9/ext/aligned_buffer.h:91:28: required from ‘struct __gnu_cxx::__aligned_buffer<std::pair<const S, int> >’ /usr/include/c++/9/bits/hashtable_policy.h:233:43: required from ‘struct std::__detail::_Hash_node_value_base<std::pair<const S, int> >’ /usr/include/c++/9/bits/hashtable_policy.h:264:12: required from ‘struct std::__detail::_Hash_node<std::pair<const S, int>, true>’ /usr/include/c++/9/bits/hashtable_policy.h:2027:13: required from ‘struct std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<const S, int>, true> > >’ /usr/include/c++/9/bits/hashtable.h:173:11: required from ‘class std::_Hashtable<S, std::pair<const S, int>, std::allocator<std::pair<const S, int> >, std::__detail::_Select1st, std::equal_to<S>, std::hash<S>, 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++/9/bits/unordered_map.h:105:18: required from ‘class std::unordered_map<S, int>’ unordered_map.cc:4:30: required from here /usr/include/c++/9/bits/stl_pair.h:214:11: error: ‘std::pair<_T1, _T2>::first’ has incomplete type 214 | _T1 first; /// @c first is a copy of the first object | ^~~~~ unordered_map.cc:2:8: note: forward declaration of ‘struct S’ 2 | struct S; | The excerpt above works fine with libc++ and MSVC's STL.