Monday, 15 July 2013

c++ - boost::any test code compiles with Sun CC but not g++ -


निम्न नोड परीक्षण कोड:

  #include & lt; iostream & gt; # शामिल करें & lt; सूची & gt; #include & lt; boost / any.hpp & gt; # शामिल करें & lt; boost / foreach.hpp & gt; # शामिल करें & lt; typeinfo.h & gt; बढ़ावा :: any_cast का उपयोग कर; Std :: cout का उपयोग कर; Std :: cerr का उपयोग कर; Typedef std :: सूची & lt; boost :: any & gt; अनेक; टेम्पलेट & lt; typename T & gt; इनलाइन बूल is_any (const boost :: कोई भी और amp); वापसी (op.type () == टाइपिड (टी)); } Int main () {बहुत से सामग्री सूची; ThetrangeList.push_back ("आप वास्तव में कर सकते हैं ..."); ThetrangeList.push_back (std :: स्ट्रिंग ("1 कंटेनर में यादृच्छिक प्रकार करते हैं?")); theStrangeList.push_back (6.359); theStrangeList.push_back (7); BOOST_FOREACH (बढ़ावा :: किसी भी, thetrangelist) {try (if_any & lt; const char * & gt; (ए)) {cout & lt; & lt; किसी भी_कास्ट & lt; const char * & gt; (ए) & lt; & lt; '\ N'; } और अगर (is_any & lt; std :: स्ट्रिंग & gt; (ए)) {cout & lt; & lt; किसी भी_कास्ट & lt; std :: स्ट्रिंग & gt; (ए) & lt; & lt; '\ N'; } और अगर (is_any & lt; डबल & gt; (ए)) {cout & lt; & lt; "डबल =" & lt; & lt; किसी भी_कास्ट & lt; डबल & gt; (ए) & lt; & lt; '\ N'; }} पकड़ (const बढ़ावा :: bad_any_cast & amp; ई) {cerr & lt; & lt; e.what (); सेर & लेफ्टिनेंट; & lt; "\ N"; }} वापसी 0; }  

सूर्य के सीसी संकलक और डिफ़ॉल्ट सेटिंग्स का उपयोग करके ठीक और काम करता है हालांकि, जी ++ का उपयोग करते समय मुझे निम्न मिलता है:

  $ g ++ -i $ BOOST_ROOT -o myany myany.cpp myany.cpp: 5: 22: typeinfo.h: ऐसा कोई फ़ाइल या निर्देशिका / आईएलएक्स नहीं है /boost_1_41_0/boost/any.hpp: निर्माता में `बढ़ावा :: कोई भी :: धारक & lt; मूल्य प्रकार & gt; :: धारक (मान मूल्य प्रकार); [ValueType = char [18]] ': / ilx / boost_1_41_0 / boost / any Hpp: 47: `बढ़ावा :: किसी भी :: किसी भी (कॉन्स्ट वैल्यू टाइप); [ValueType = चार [18]] के साथ instantiated 'myany.cpp: 21: यहां से शुरू / / xx_boost_1_41_0/boost/any.hpp:122 : त्रुटि: आईएसओ सी ++ एआरएम्स की निषेध निरोधक  

यह जी ++ संस्करण 3.4.3 है, इसलिए यह 4.x संस्करण पर भिन्न हो सकता है, मैं इसे बाद में कोशिश करूंगा क्या ऐसा कारण है कि किसी भी को बढ़ावा देने के साथ 'is_any' टेम्पलेट शामिल नहीं है, या यह एक कंपाइलर बग है?

अगर मैं टेम्पलेट को निकालता हूं, तो मुझे उसी परिणाम मिलता है इनलाइन फ़ंक्शन।

लगता है कि मैंने केवल प्रश्न के दूसरे भाग का उत्तर दिया है, तो यहां मैं पहले भाग के साथ भी जाता हूं:

क्या ऐसा कारण है कि कोई भी '' कुछ नहीं 'टेम्पलेट जिसमें कोई बढ़ावा देने के साथ शामिल है?

कोई वास्तविक आवश्यकता नहीं है is_any , इसके बजाय निम्नलिखित करें:

  यदि (const std :: string * s = boost :: any_cast & lt; std :: string & gt; (& amp; a)) {Std :: cout & lt; & lt; "स्ट्रिंग =" & lt; & lt; * S & lt; & lt; '\ N'; } और यदि (const डबल * d = boost :: any_cast & lt; डबल & gt; (& amp; a)) {std :: cout & lt; & lt; "डबल =" & lt; & lt; * डी एंड एलटी; & lt; '\ N'; }  

लेकिन यह एक्स्टेंसिबल नहीं है, इसके बजाय boost :: variant का उपयोग करना पसंद करता है।

क्या यह एक कंपाइलर बग है?

यह सूर्य सीसी में एक संकलक बग है जीसीसी सही है, "क्या आप वास्तव में हो सकता है ..." है char [18] , जो बढ़ावा देने की आवश्यकताओं को पूरा नहीं करता :: कोई भी:

  • एक ValueType है CopyConstructible।
  • एक ValueType वैकल्पिक रूप से असाइन किया जा सकता है।
  • किसी वैल्यूएट के लिए डिस्ट्रक्टर ने अप-अप-सुरक्षा गारंटी की कोई गारंटी नहीं दी है।

No comments:

Post a Comment