2016-06-11 36 views
5

我必須缺少關於emplace()和朋友的更好的一點。下面是使用g ++ 4.9.3再現該問題的完整,最小的例如: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

@Steger你不能保證它可以工作,因爲它可能是一個未指定的基類,它可以完成構建。 – Barry

2
bars.emplace_back(*this); 

延遲調用構造函數Bar(Foo&)std::vector::emplace_back()。該功能不具有調用Bar(Foo&)的訪問權限。

在另一方面,

bars.push_back(*this); 

調用調用std::vector::push_back()之前構造Bar(Foo&)。這不是問題,因爲Foo是的Bar