Domanda

Visual Studio Enterprise 2010, SP1, su Windows 7 64 bit. Boost 1.48.0.

Qui inizia il codice pertinente. Questi bit sono definiti in un'intestazione.

//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;
.

E questo è nel corpo di un costruttore di 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);
});
.

L'errore che sto trovando è con il parametro elenco della lambda. Swap viene chiamato, penso nel costruttore della coppia della coppia, cercando di assegnare prima dal rvalue passarono alla lambda al parametro. Il compilatore pensa che "Value.First" sia conST quando viene assegnato a nel costruttore STD :: coppia copia. Ma chiaramente, il parametro non è constabile qualificato, la mappatura_type o key_type non è constabile qualificata, il costruttore della copia non è un metodo costoso e nessuno di ciò dovrebbe comunque importare.

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
          ]
.

Così in qualche modo, il parametro del modello sta diventando costante qualificato e per la vita di me, non riesco a capire perché.

Penso che qualcos'altro stia intrappolando il compilatore, ma non ho nient'altro da cui andare. In precedenza, prima di dare il mio codice sorgente un buon movimento, cercando di capirlo, potrei attivare e disattivare questo messaggio di errore; Avevo definito un boost :: static_vistotor di classe derivata. Nessun membro, nessun metodo, niente. Questo è stato sufficiente per causare questo errore nel mio costruttore di copia qui. Non riesco a immaginare in che altro modo isolare ciò che è effettivamente la linea di codice offensiva ...

Qualcuno pensa che questo sia un hiccup del compilatore e che alcuni cambiamenti non menzionati hanno questo come effetto collaterale?

È stato utile?

Soluzione

Il value_type del std::map<K, V> è std::pair<K const, V>, perché i tasti sono immutabili.Quindi, sì, value.first è costantemente qualificato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top