2016-06-11 26 views
5

Emplace() ve arkadaşları ile ilgili daha ince noktalardan birini kaçırmam gerekir. Burada 4.9.3 ++ g sorunu yeniden üreten bir tam minimum örnek:g ++ 4.9.3, arkadaşlık yapan katıcının .emplace_back() ile gizli olduğunu, ancak hoşlandığını iddia ediyor .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

Düzenlemenizi geri aldım. Lütfen cevaplarınızı aldıktan sonra sorularınızı değiştirmeyin. Yeni bir sorunuz varsa, yeni bir soru gönderin. – Barry

cevap

10

emplace_back, kap Bar yapıları biridir. Ama bu kurucu özel ve konteyner arkadaş değil, bu yüzden başarısız olur.

Ancak push_back(*this), push_back(Bar(*this)) eşdeğerdir. Yani, bu yapıyı yapan Foo ve bir arkadaş.

+0

Etkileyici. Konteyneri arkadaş edinme konusunda herhangi bir fikrin var mı? – Steger

+0

@Steger, çalışacağını garanti edemezsiniz çünkü bu, yapım işlemini belirsiz bir temel sınıf olabilir. – Barry

2
bars.emplace_back(*this); 

std::vector::emplace_back() için yapıcı Bar(Foo&) çağrısına geciktirir. Bu işlev, Bar(Foo&)'u aramak için erişim ayrıcalığına sahip değil. Öte yandan

,

bars.push_back(*this); 

std::vector::push_back() çağrısı önce yapıcısı Bar(Foo&) çağırır. Bu FoofriendBar olduğundan bir sorun değil.