2016-07-15 29 views
0

Ich erstelle einen neuen Zeiger auf ein neues Objekt und sofort push_front in eine Deque. Ich möchte stattdessen emplace_front verwenden, bekomme aber einen Compilerfehler.Deque emplace_back Neuer Zeiger auf Objekt

Mein Objektkonstruktor benötigt 1 Zeichenfolgenargument.

std::deque<NetPacket*> q_IncomingPackets; 

q_IncomingPackets.push_back(new NetPacket(std::string(uncompressed_data, retVal)))); 
q_IncomingPackets.emplace_back(std::string(uncompressed_data, retVal)); 

Nach Referenzen von anderen Websites, die ich dachte, dass ich einfach push_back für emplace_back tauschen könnte, aber die folgende Fehlermeldung erhalten:

Error C2440 'initializing': cannot convert from 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' to 'PeerNet::NetPacket *' PeerNet \vc\include\xmemory0 737 

Die Referenzen über die Verwendung einzulagern nicht reden, wenn neue Zeiger auf Objekte zu schaffen, nur konkrete Objekte. cppreference.comcplusplus.com

Antwort

1

std::deque::emplace_back erwartet Args&&... argsvalue_type, zu konstruieren, die hier NetPacket* ist.

Es gibt keine Möglichkeit NetPacket* von std::string zu konstruieren, deshalb sagt der Compilerfehler.

Da Ihr Werttyp NetPacket* ist (es ist ein roher Zeiger), gibt es keinen zu großen Unterschied zwischen push_back und emplace_back.