2011-12-20 8 views
7

के लिए मुझे के जीवन नहीं समझा जा सकता है क्यों यह विफल रहता है:बूस्ट :: बराबर श्रेणियों को प्रतिलिपि बनाने की आवश्यकता क्यों होती है?

#include <vector> 

#include "boost/algorithm/string/predicate.hpp" 

struct Test 
: 
    public std::vector<int> 
{ 
    Test() { } 
    Test(const Test&) { assert(false); } 
}; 

int main() 
{ 
    Test a; 
    Test b; 
    boost::algorithm::equals(a, b); 

    return 0; 
} 

आउटपुट:

$ g++ boostEqualsCopyDemo.cpp -I /usr/include/boost-1_47 
$ a.out 
a.out: boostEqualsCopyDemo.cpp:10: Test::Test(const Test&): Assertion `false' failed. 
Aborted (core dumped) 

मैं बढ़ावा कोड के माध्यम से खुदाई की कोशिश की है, लेकिन यह मेरे सिर स्पिन बना रहा है। यह बेतुका लगता है; इतना अपमानजनक और अनावश्यक। क्या चल रहा है?

उत्तर

10

बूस्ट आपके द्वारा पास किए गए कंटेनरों के लिए श्रेणियों का एक सेट बनाने का प्रयास कर रहा है, और यह range_detail::is_char_ptr() पर कॉल करना समाप्त कर देता है, जो कि टेम्पलेट पैरामीटर कटौती का उपयोग करता है यह निर्धारित करने के लिए कि पैरामीटर char है किसी प्रकार का सूचक या नहीं (जैसा कि आप नाम से अनुमान लगा सकते हैं)।

दुर्भाग्यवश, 'कैच-ऑल' फ़ंक्शन टेम्पलेट जो 0 लौटाता है जब गैर-चर-पॉइंटर पैरामीटर मिलान करते हैं तो इसका मानदंड मानता है।

मुझे लगता है कि इसके बजाय const& लेने के लिए पैरामीटर को बदलकर इसे ठीक किया जा सकता है। के लिए फ़ाइल boost/range/as_literal.hpp में देखो:

template< class T > 
    inline long is_char_ptr(T /* r */) 
    { 
     return 0L; 
    } 

और के लिए इसे बदल:

template< class T > 
    inline long is_char_ptr(T const& /* r */) // <-- add const& 
    { 
     return 0L; 
    } 

मैं किसी भी तरह से कर रहा हूँ जटिल टैम्पलेट लाइब्रेरियों के कार्यान्वयन में एक विशेषज्ञ (मैं का उपयोग उन्हें, मैं 'का अर्थ है टी लिखो '), इसलिए मैं कोई दावा नहीं करता कि यह परिवर्तन कुछ अन्य दुष्प्रभाव का कारण नहीं बनता है।

+4

इस समस्या पर एक बग रिपोर्ट के लिए https://svn.boost.org/trac/boost/ticket/6149 देखें। –

+1

यह फिक्स अब बूस्ट ट्रंक में है, और 1.50 रिलीज का हिस्सा होना चाहिए: https://svn.boost.org/trac/boost/ticket/6149#commenton –

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