2016-12-15 8 views
5

निम्नलिखित कोड जीसीसी के तहत संकलित करने के लिए विफल रहता है बजना नहीं का कारण बनता है 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++ पर कोड काम करने के लिए कर सकता हूं?

धन्यवाद!

+0

क्या आप 'एम' को सूचक में ही बदल सकते हैं? –

+0

जो एक दृष्टिकोण हो सकता है, लेकिन मैं यह नहीं समझ सकता कि इसे कैसे काम करना है। एक बार जब मैं एक पॉइंटर बना देता हूं, तो जीसीसी खुश होता है, लेकिन जैसे ही मैं कन्स्ट्रक्टर में नया कॉल करने की कोशिश करता हूं उदा। 'फू(): एम (नया std :: unordered_map ()) {}', मुझे एक ही समस्या का सामना करना पड़ता है। – lilinjn

उत्तर

0

मैं सुझाव है कि आप अगले ढंग से फू वर्ग को संशोधित करने के:

class Foo { 
public: 
    Foo(); 
private: 
    using MapType = std::unordered_map<std::string, Foo>; 
    std::shared_ptr<MapType> m_ptr; 
}; 

// Here Foo is already defined. 
Foo::Foo() { 
    m_ptr = std::make_shared<MapType>(); 
} 

इस कोड clang 3.9 और gcc 6.2 दोनों के साथ ठीक संकलित करता है।

+0

मैं खुद को 'unique_ptr' के साथ चला गया होता, जो कस्टम कॉपी कन्स्ट्रक्टर लिखने की आवश्यकता को हाइलाइट करता। – hvd

+0

@hvd मैंने पीआरटी के प्रकार के बारे में बहुत कुछ नहीं सोचा, बस कुछ ऐसा जो कस्टम मेमोरी प्रबंधन से बचने में मदद करता है। वैसे भी, मुख्य विचार यह था कि संकलन समस्याओं से बचने के लिए कोड को पुनर्व्यवस्थित कैसे किया जाए। –

संबंधित मुद्दे