2016-06-11 14 views
5

Mi manca uno dei punti migliori riguardo a emplace() e agli amici. Ecco un completo esempio minimo che riproduce il problema con g ++ 4.9.3:g ++ 4.9.3 si lamenta che CID amico è privato con .emplace_back(), ma likes .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

Ho ripristinato la modifica. Si prega di non cambiare le vostre domande dopo aver ricevuto le risposte. Se hai una nuova domanda, pubblica una nuova domanda. – Barry

risposta

10

In emplace_back, il contenitore è quella che costruisce la Bar. Ma quel costruttore è privato e il contenitore non è un amico, quindi fallisce.

Ma push_back(*this) equivale a push_back(Bar(*this)). Cioè, è il Foo che sta facendo la costruzione ed è un amico.

+0

Impressionante. Qualche idea su come rendere il contenitore un amico? – Steger

+0

@Steger non si può garantire che funzioni, poiché potrebbe essere una classe base non specificata che esegue la costruzione. – Barry

2
bars.emplace_back(*this); 

ritarda la chiamata al costruttore Bar(Foo&) a std::vector::emplace_back(). Quella funzione non ha il privilegio di accesso per chiamare Bar(Foo&).

D'altra parte,

bars.push_back(*this); 

chiama il costruttore Bar(Foo&) prima della chiamata a std::vector::push_back(). Questo non è un problema poiché Foo è un friend di Bar.

Problemi correlati