2013-05-25 13 views
9

mio struct:spinta avvertimento serializzazione C4308: costante integrale negativo convertito tipo unsigned

struct member{ 
     std::string ip_address; 
     std::string port; 

    protected: 
     friend class boost::serialization::access; 

     template<class Archive> 
     void serialize(Archive & ar, const unsigned int version) 
     { 
      ar & ip_address; 
      ar & port; 
     } 
    }; 

quando lo uso per salvare e caricare funziona perfettamente, tutti i dati sono come mi aspetto che sia,

std::vector<member> members; 
std::ostringstream ss; 
boost::archive::text_oarchive oa(ss); 
oa<<members; 


std::istringstream ss_(received_data.data()); 
boost::archive::text_iarchive ia(ss_); 
ia>>members; 

ma sulla compilazione ottengo questo avvertimento

warning C4308: negative integral constant converted to unsigned type 
1>  c:\program files\boost\boost_1_51\boost\serialization\static_warning.hpp(92) : see reference to class template instantiation 'boost::mpl::print<T>' being compiled 
1>  with 
1>  [ 
1>   T=boost::serialization::BOOST_SERIALIZATION_STATIC_WARNING_LINE<98> 
1>  ] 
1>  c:\program files\boost\boost_1_51\boost\archive\detail\check.hpp(98) : see reference to class template instantiation 'boost::serialization::static_warning_test<B,L>' being compiled 
1>  with 
1>  [ 
1>   B=false, 
1>   L=98 
1>  ] 
1>  c:\program files\boost\boost_1_51\boost\archive\detail\oserializer.hpp(313) : see reference to function template instantiation 'void boost::archive::detail::check_object_tracking<T>(void)' being compiled 
1>  with 
1>  [ 
1>   T=std::vector<member> 
1>  ] 
1>  c:\program files\boost\boost_1_51\boost\archive\detail\oserializer.hpp(525) : see reference to function template instantiation 'void boost::archive::detail::save_non_pointer_type<Archive>::invoke<T>(Archive &,T &)' being compiled 
1>  with 
1>  [ 
1>   Archive=boost::archive::text_oarchive, 
1>   T=std::vector<member> 
1>  ] 
1>  c:\program files\boost\boost_1_51\boost\archive\detail\common_oarchive.hpp(69) : see reference to function template instantiation 'void boost::archive::save<Archive,T>(Archive &,T &)' being compiled 
1>  with 
1>  [ 
1>   Archive=boost::archive::text_oarchive, 
1>   T=std::vector<member> 
1>  ] 
1>  c:\program files\boost\boost_1_51\boost\archive\basic_text_oarchive.hpp(80) : see reference to function template instantiation 'void boost::archive::detail::common_oarchive<Archive>::save_override<T>(T &,int)' being compiled 
1>  with 
1>  [ 
1>   Archive=boost::archive::text_oarchive, 
1>   T=std::vector<member> 
1>  ] 
1>  c:\program files\boost\boost_1_51\boost\archive\detail\interface_oarchive.hpp(63) : see reference to function template instantiation 'void boost::archive::basic_text_oarchive<Archive>::save_override<T>(T &,int)' being compiled 
1>  with 
1>  [ 
1>   Archive=boost::archive::text_oarchive, 
1>   T=std::vector<member> 
1>  ] 
1>  c:\users\user\desktop\shve\shve\member_server.h(58) : see reference to function template instantiation 'Archive &boost::archive::detail::interface_oarchive<Archive>::operator <<<std::vector<_Ty>>(T &)' being compiled 
1>  with 
1>  [ 
1>   Archive=boost::archive::text_oarchive, 
1>   _Ty=member, 
1>   T=std::vector<member> 
1>  ] 
+0

Allora, qual è la domanda? –

+0

perché ricevo l'avviso? Come risolverlo? –

+0

Con altri compilatori si potrebbero ottenere altri avvisi generati per la stessa causa, ad es. con clang è: 'include/boost/mpl/print.hpp: 50: 23: warning: la divisione per zero non è definita [-Wdivision-by-zero]' – maxschlepzig

risposta

16

Boost è nervoso che siete archiving non-const class instances quale potrebbe causare un problema con il rilevamento dell'oggetto se diversi oggetti monitorati utilizzano lo stesso indirizzo.

Per rimuovere l'avviso si potrebbe lanciare il tuo oggetto al const:

oa << const_cast<const std::vector<member>&>(members); 

Oppure si può semplicemente utilizzare il & dell'operatore:

oa & members; 

Quella era la fonte dell 'avvertimento in questo particolare (e comune) caso. In generale, questo tipo di avviso del compilatore viene generato da Boost di proposito con una chiamata alla macro BOOST_STATIC_WARNING e quindi la causa potrebbe essere qualsiasi cosa che Boost vuole che tu stia attento. Questo è generalmente spiegato in un commento che accompagna l'invocazione della macro (che è possibile individuare dal messaggio di errore del compilatore). Per esempio, l'invito a questo specifico avvertimento è venuto da boost\archive\detail\check.hpp:

// saving an non-const object of a type not marked "track_never) 
// may be an indicator of an error usage of the 
// serialization library and should be double checked. 
// See documentation on object tracking. Also, see the 
// "rationale" section of the documenation 
// for motivation for this checking. 

BOOST_STATIC_WARNING(typex::value); 
+0

Hm, qual è la ragione per cui boost pensa che il '& 'l'operatore è più sicuro da usare in quel contesto? Un'alternativa (per alcuni casi d'uso) è forse anche l'uso di 'BOOST_CLASS_TRACKING (, boost :: serialization :: track_never)' - ad es. quando serializzi oggetti dallo stack. – maxschlepzig

+0

Avevo rintracciato la spiegazione di riferimento, ma non avevo ancora idea di cosa fare - vorrei che il commento includesse il riferimento all'operatore '&'. – sage

Problemi correlati