2016-06-11 8 views
5

मुझे इमस्थल() और दोस्तों के बारे में बेहतर बिंदुओं में से एक गायब होना चाहिए। यहां एक संपूर्ण, कम से कम उदाहरण है कि ++ जी के साथ 4.9.3 समस्या reproduces है:g ++ 4.9.3 शिकायत करता है कि मित्रवत ctor .emplace_back() के साथ निजी है, लेकिन पसंद है .push_back()

class Foo 
{ 
public: 
    class Bar 
    { 
    private: 
    friend class Foo; 
     Bar(Foo &foo) : foo(foo) {} 
     Foo &foo; 
    }; 

    Bar &getBar() 
    { 
     //bars.push_back(*this);  // works fine 
     bars.emplace_back(*this);  // Foo::Bar::Bar(Foo&) is private 
     return bars.back(); 
    } 
private: 
    std::vector<Bar> bars; 
}; 
+3

मैंने आपके संपादन को वापस ले लिया। उत्तर प्राप्त करने के बाद कृपया अपने प्रश्नों को न बदलें। यदि आपका कोई नया प्रश्न है, तो एक नया प्रश्न पोस्ट करें। – Barry

उत्तर

10

emplace_back में, कंटेनर एक है कि Bar निर्माण करती है। लेकिन वह कन्स्ट्रक्टर निजी है और कंटेनर मित्र नहीं है, इसलिए यह विफल रहता है।

लेकिन push_back(*this)push_back(Bar(*this)) के बराबर है। यही है, यह Foo है जो निर्माण कर रहा है और यह एक दोस्त है।

+0

प्रभावशाली। कंटेनर को दोस्त बनाने के तरीके पर कोई विचार? – Steger

+0

@ स्टेगर आप गारंटी नहीं दे सकते कि यह काम करेगा, क्योंकि यह एक अनिर्धारित बेस क्लास हो सकता है जो निर्माण करता है। – Barry

2
bars.emplace_back(*this); 

std::vector::emplace_back() के निर्माता Bar(Foo&) करने के लिए कॉल विलंब। उस फ़ंक्शन में Bar(Foo&) पर कॉल करने का एक्सेस विशेषाधिकार नहीं है।

दूसरी ओर,

bars.push_back(*this); 

std::vector::push_back() को कॉल करने से पहले निर्माता Bar(Foo&) कहता है। FooBar के friend के बाद से कोई समस्या नहीं है।

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