2013-05-25 1 views
9

मेरी struct:बढ़ावा क्रमबद्धता चेतावनी C4308: नकारात्मक अभिन्न निरंतर अहस्ताक्षरित प्रकार में बदल जाती

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; 
     } 
    }; 

जब मैं इसका इस्तेमाल बचाने के लिए और लोड यह पूरी तरह से काम करता है, के रूप में मैं इसे होने की उम्मीद सभी डेटा है,

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; 

लेकिन संकलन पर मैं इस चेतावनी

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

तो, सवाल क्या है? –

+0

मुझे चेतावनी क्यों मिलती है? इसे कैसे हल करें? –

+0

अन्य कंपाइलरों के साथ एक ही कारण के लिए उत्पन्न अन्य चेतावनी मिल सकती है - उदा। क्लैंग के साथ यह है: 'शामिल/बूस्ट/एमपीएल/प्रिंट एचपीपी: 50: 23: चेतावनी: शून्य से विभाजन अनिर्धारित है [-विडिविजन-बाय-शून्य] ' – maxschlepzig

उत्तर

16

बूस्ट परेशान है मिलता है कि आप कर रहे हैं archiving non-const class instances ऑब्जेक्ट ट्रैकिंग के साथ समस्या का कारण बन सकता है यदि अलग-अलग ट्रैक किए गए ऑब्जेक्ट एक ही पते का उपयोग करते हैं।

चेतावनी आप स्थिरांक करने के लिए अपने वस्तु डाली सकता है निकालने के लिए:

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

या आप बस & ऑपरेटर का उपयोग कर सकते हैं:

oa & members; 

कि इस विशेष रूप से चेतावनी का स्रोत था (और आम) मामला। आम तौर पर, इस प्रकार की कंपाइलर चेतावनी बूस्ट द्वारा BOOST_STATIC_WARNING मैक्रो पर कॉल के साथ उत्पन्न होती है और इसलिए कारण कुछ भी हो सकता है जो बूस्ट चाहता है कि आप सावधान रहें। यह आम तौर पर मैक्रो आमंत्रण के साथ एक टिप्पणी में लिखा जाता है (जिसे आप अपने कंपाइलर त्रुटि संदेश से ढूंढ सकते हैं)। उदाहरण के लिए, इस विशिष्ट चेतावनी के लिए कॉल 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

एचएम, कारण यह है कि बढ़ावा देने के कारण क्या है & ऑपरेटर उस संदर्भ में उपयोग करने के लिए सुरक्षित है? एक विकल्प (कुछ उपयोग मामलों के लिए) शायद 'BOOST_CLASS_TRACKING (, boost :: serialization :: track_never) 'का उपयोग करने के लिए भी है - उदा। जब ढेर से वस्तुओं को serializing। – maxschlepzig

+0

मैंने संदर्भित स्पष्टीकरण को ट्रैक किया था, लेकिन अभी भी यह नहीं पता था कि क्या करना है - मेरी इच्छा है कि उस टिप्पणी में '&' ऑपरेटर के संदर्भ शामिल हों। – sage

संबंधित मुद्दे