Recientemente me encontré con un problema extraño en el que obtendría un const_iterator
en lugar del iterator
esperado al iterar a través de un multiset. Resultó ser un no-problema para MSVC pero g ++ me dio un error:Estándar de C++: const_iterator inesperado en multiset
error: invalid initialization of reference of type 'myPtr&' from expression of type 'const boost::shared_ptr'
código relevante:
typedef std::multiset<myPtr> myList;
myList _mystuff;
void tick(float dt)
{
for (myList::iterator i = _mystuff.begin(); i != _mystuff.end(); ++i)
{
myPtr &mine = *i; // g++ problem here, not for MSVC
// const myPtr &mine = *i; works fine for g++
mine->tick(dt);
}
}
un poco de investigación reveló que es un problema con un montón de discusión previa . He encontrado estos bits relevantes:
- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14990
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#322
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#279
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#528
Mi conocimiento de fondo y la comprensión de la cuestión es limitado y por lo tanto me gustaría gustaría saber si el estándar no define esto comportamiento suficientemente bien en cuyo caso g ++ y MSVC implementan el comportamiento a su gusto o si g ++ o MSVC se desvían de un estándar bien definido.
Gracias de antemano.
cambio de la decl de 'mío' a 'const myPtr y mine'. Por supuesto, 'tick' tendrá que declararse 'void tick (float) const;' y cualquier miembro de datos modificado por tick necesitará ser 'mutable'. – KitsuneYMG