Bemerkt eine eigentümliche Verhalten aufgerufen, wenn std :: map aus einer Funktion, die nicht den Zustand seines Objekts ändern:Karte <string, int> wirft std :: out_of_range, wenn sie von konstanter Funktion
std::map<std::string, int> _attribLocations;
...
int ProgramInfo::getAttribLocation(const std::string& name) const
{
return _attribLocations.at(name);
}
Als ich das nennen Funktion, vorbei an einer Stringliteral, die Lookup wirft out_of_range Ausnahme:
auto index = info.getAttribLocation("v_position");
ich bemerkte, gibt es zwei Versionen an(), eine, die eine const_iterator verwendet, und eine, die nicht:
mapped_type& at(const key_type& _Keyval)
{ // find element matching _Keyval
iterator _Where = _Mybase::lower_bound(_Keyval);
if (_Where == _Mybase::end()
|| _Mybase::_Getcomp()(_Keyval, _Mybase::_Key(_Where._Mynode())))
_Xout_of_range("invalid map<K, T> key");
return (_Where->second);
}
const mapped_type& at(const key_type& _Keyval) const
{ // find element matching _Keyval
const_iterator _Where = _Mybase::lower_bound(_Keyval);
if (_Where == _Mybase::end()
|| _Mybase::_Getcomp()(_Keyval, _Mybase::_Key(_Where._Mynode())))
_Xout_of_range("invalid map<K, T> key");
return (_Where->second);
}
};
Es ist wie der Teil scheint, dass es zu werfen verursacht ist:
_Mybase::_Getcomp()(_Keyval, _Mybase::_Key(_Where._Mynode()
))
ich nicht wirklich debuggen jede tiefer.
Ich bin mit Visual Studio 2015
Ich bin sicher, dass der Schlüssel in der Karte existiert übergeben wird (von der Karte mit einem Debugger Inspektion). Könnte es ein Fehler in der Map-Implementierung sein, oder fehlt mir etwas beim Vergleichen von Strings?
Ich verwende VS2015 Update 2 und kann dieses Verhalten nicht reproduzieren. Haben Sie versucht, dies in einem minimalen Beispielprojekt zu reproduzieren? – Wurmloch
Sie müssen uns [MCVE] (http://stackoverflow.com/help/mcve) zeigen. –
Vergiss es, ich bin dumm. –