2016-04-07 15 views
0

habe ich eine Karte wie folgt definiert:Fehler std :: map mit :: at

map<std::string,std::vector<message *> > data; 

Wo std::string auf einen Benutzernamen (Primärschlüssel) bezeichnet und std::vector<message *> auf die Nachrichten zu einem bestimmten Benutzernamen entspricht. Nachricht ist eine Struktur, die Nachrichten-ID, Uhrzeit und den Nachrichtentext enthält. Deshalb, um eine andere Nachricht zurück zu drängen, verwende ich den folgenden Code:

std::vector<message *> messages = data.at[recvbuf_usrn]; 
messages.push_back(new message(*recvbuf_msg,currentDateTime())); 
data[*recvbuf_usrn] = messages; 

aber ich erhalte eine Fehlermeldung:

error C3867: 'std::map<_Kty,_Ty>::at': function call missing argument list; use '&std::map<_Kty,_Ty>::at' to create a pointer to member 

Wo recvbuf_usrn und recvbuf_msg sind wie folgt definiert:

std::string *recvbuf_usrn=new std::string; 
std::string *recvbuf_msg=new std::string; 

Wie kann ich es lösen?

Antwort

1

Es sollte

sein
data.at(recvbuf_usrn); 

(at mit Eltern). oder

data[recvbuf_usrn]; 

BTW, die einen Verweis zurückgeben, so können Sie einfach tun:

auto& messages = data[recvbuf_usrn]; 
messages.push_back(new message(*recvbuf_msg, currentDateTime())); 

Sie sollte wohl auch Smart-Pointer verwenden:

std::map<std::string, std::vector<std::unique_ptr<message>>> data; 
1

std::map::at ist Funktion, sollten Sie nennen Sie es:

std::vector<message *> messages = data.at(*recvbuf_usrn); 

Wenn Sie std::map::operator[] verwenden möchten, sollten Sie:

std::vector<message *> messages = data[*recvbuf_usrn];