Pregunta

Visual Studio Enterprise 2010, sp1, en Windows 7 de 64 bits.Impulsar 1.48.0.

Aquí comienza el código relevante.Estos bits se definen en un encabezado.

//typedef struct {} empty_t;
//typedef std::pair<size_t, std::shared_ptr<char>> string_t; //Don't ask...
//typedef boost::variant<empty_t, long, double, some other PODs, string_t> variant_t;
//typedef std::map<unsigned short, variant_t> variant_map_t;

y esto está en el cuerpo de un constructor de copia:

std::for_each(std::begin(incoming.values_), std::end(incoming.values_), [&](variant_map_t::value_type value)
{
    // This guy is going to populate this::values_, doing the right thing -
    // copying by value native and POD types, or deep copying pointers.
    boost::apply_visitor(deep_copy_visitor(*this, value.first), value.second);
});

El error que encuentro está en la lista de parámetros de lambda.Se está llamando a swap, creo que en el constructor de copia del par, tratando de asignar primero desde el rvalue pasado a la lambda al parámetro.El compilador piensa que "value.first" es constante cuando se asigna en el constructor de copia std::pair.Pero claramente, el parámetro no está calificado de manera constante, el tipo_mapeado o el tipo_de_clave no están calificados de manera constante, el constructor de copia no es un método constante y NINGUNO DE ESO DEBERÍA IMPORTAR DE TODOS MODOS.

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility(209) : see reference to function template instantiation 'void std::_Swap_adl<_Ty1>(_Ty &,_Ty &)' being compiled
          with
          [
              _Ty1=unsigned short,
              _Ty=unsigned short
          ]
          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility(206) : while compiling class template member function 'void std::pair<_Ty1,_Ty2>::swap(std::pair<_Ty1,_Ty2> &)'
          with
          [
              _Ty1=const unsigned short,
              _Ty2=variant_t
          ]
          src\foo.cpp(506) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled
          with
          [
              _Ty1=const unsigned short,
              _Ty2=variant_t
          ]

Entonces, de alguna manera, el parámetro de plantilla se está calificando de manera constante y, por mi vida, no puedo entender por qué.

Creo que algo más está haciendo tropezar al compilador, pero no tengo nada más de qué partir.Anteriormente, antes de darle un buen revuelo a mi código fuente, tratando de resolver esto, podía activar y desactivar este mensaje de error;Había definido una clase derivada boost::static_visitor.Sin miembros, sin métodos, nada.Eso fue suficiente para causar este error en mi constructor de copias aquí.No puedo imaginar de qué otra manera aislar lo que es DE HECHO la línea de código ofensiva...

¿Alguien piensa que esto es un problema del compilador y que algún cambio no mencionado tiene esto como efecto secundario?

¿Fue útil?

Solución

El value_type de std::map<K, V> es std::pair<K const, V>, porque las claves son inmutables.Entonces sí, value.first está calificado constantemente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top