निम्नलिखित कोड जीसीसी के तहत संकलित करने के लिए विफल रहता है बजना नहीं का कारण बनता है 5.3 (यह कोड का एक बड़ा टुकड़ा से लिया एक कम संस्करण है):स्व निर्देशात्मक unordered_map के उपयोग जीसीसी 5.3 के लिए समस्या है लेकिन
#include <unordered_map>
#include <string>
class Foo {
std::unordered_map<std::string, Foo> m; //"self-referential"
};
int main()
{
Foo f;
return 0;
}
साथ निम्न त्रुटियों:
012:g++ --std=c++1y -c rh.cpp
In file included from /usr/local/include/c++/5.3.0/utility:70:0,
from /usr/local/include/c++/5.3.0/unordered_map:38,
from rh.cpp:1:
/usr/local/include/c++/5.3.0/bits/stl_pair.h: In instantiation of ‘struct std::pair<const int, Foo>’:
/usr/local/include/c++/5.3.0/ext/aligned_buffer.h:85:34: required from ‘struct __gnu_cxx::__aligned_buffer<std::pair<const int, Foo> >’
/usr/local/include/c++/5.3.0/bits/hashtable_policy.h:246:43: required from ‘struct std::__detail::_Hash_node_value_base<std::pair<const int, Foo> >’
/usr/local/include/c++/5.3.0/bits/hashtable_policy.h:292:12: required from ‘struct std::__detail::_Hash_node<std::pair<const int, Foo>, false>’
/usr/local/include/c++/5.3.0/bits/hashtable_policy.h:1896:60: required from ‘struct std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<const int, Foo>, false> > >’
/usr/local/include/c++/5.3.0/bits/hashtable.h:170:11: required from ‘class std::_Hashtable<int, std::pair<const int, Foo>, std::allocator<std::pair<const int, Foo> >, std::__detail::_Select1st, std::equal_to<int>, std::hash<int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true> >’
/usr/local/include/c++/5.3.0/bits/unordered_map.h:101:18: required from ‘class std::unordered_map<int, Foo>’
rh.cpp:4:32: required from here
/usr/local/include/c++/5.3.0/bits/stl_pair.h:102:11: error: ‘std::pair<_T1, _T2>::second’ has incomplete type
_T2 second; /// @c second is a copy of the second object
^
rh.cpp:3:7: note: forward declaration of ‘class Foo’
class Foo {
(पर OSX मैं लिनक्स पर 3.8 परीक्षण किया है, और 3.9) बजना का उपयोग कर कोड के साथ कोई समस्या है
clang++ --std=c++1y --stdlib=libc++ -c rh.cpp
linux पर, बजना + libstdC++ भी विफल रहता है का उपयोग कर।
मुद्दा libstdC++ करने के लिए नीचे अपने हैश नक्शा कार्यान्वयन है, जो एक पूरा प्रकार की जरूरत में एक __gnu_cxx::__aligned_buffer
का उपयोग कर आ रहा है।
दोनों मानक पुस्तकालय ठीक काम करते हैं जब std :: map का उपयोग किया जाता है, लेकिन यह कोई समाधान नहीं है जिसे मैं स्वीकार कर सकता हूं। न ही नक्शा का मूल्य प्रकार Foo पर पॉइंटर होना चाहिए।
क्या कोई अन्य परिवर्तन है जो मैं gcc/libstdC++ पर कोड काम करने के लिए कर सकता हूं?
धन्यवाद!
क्या आप 'एम' को सूचक में ही बदल सकते हैं? –
जो एक दृष्टिकोण हो सकता है, लेकिन मैं यह नहीं समझ सकता कि इसे कैसे काम करना है। एक बार जब मैं एक पॉइंटर बना देता हूं, तो जीसीसी खुश होता है, लेकिन जैसे ही मैं कन्स्ट्रक्टर में नया कॉल करने की कोशिश करता हूं उदा। 'फू(): एम (नया std :: unordered_map()) {}', मुझे एक ही समस्या का सामना करना पड़ता है। –
lilinjn