के कारण टेम्पलेटेड फ़ंक्शन पर संदिग्ध कॉल मुझे इस समस्या से दो बार काट दिया गया है और इसलिए मेरे सहयोगी भी हैं।एडीएल
#include <deque>
#include <boost/algorithm/string/find.hpp>
#include <boost/operators.hpp>
template< class Rng, class T >
typename boost::range_iterator<Rng>::type find(Rng& rng, T const& t) {
return std::find(boost::begin(rng), boost::end(rng), t);
}
struct STest {
bool operator==(STest const& test) const { return true; }
};
struct STest2 : boost::equality_comparable<STest2> {
bool operator==(STest2 const& test) const { return true; }
};
void main() {
std::deque<STest> deq;
find(deq, STest()); // works
find(deq, STest2()); // C2668: 'find' : ambiguous call to overloaded function
}
संकलित करते समय ... दूसरे खोज को संकलित करते समय वीएस 9 कंपाइलर विफल रहता है। यह इस तथ्य के कारण है कि STest2
बूस्ट नेमस्पेस में परिभाषित एक प्रकार से विरासत प्राप्त करता है जो संकलक को एडीएल को आजमाने की कोशिश करता है जो boost::algorithm::find(RangeT& Input, const FinderT& Finder)
पाता है।
एक स्पष्ट समाधान है find(…)
पर ::
"के साथ कॉल को उपसर्ग करना है, लेकिन यह आवश्यक क्यों है? वैश्विक नामस्थान में एक बिल्कुल वैध मिलान है, तो क्यों तर्क-निर्भर लुकअप का आह्वान करें? क्या कोई यहां तर्क को समझा सकता है?
ध्यान दें कि मैच सही नहीं है। एक गैर-टेम्पलेट फ़ंक्शन 'ढूंढें (std :: डेक, स्टेस्ट);' एक बेहतर मैच होगा। –
MSalters
@MSalters: आप बिल्कुल सही हैं। वैश्विक नामस्थान में मैच सही नहीं है। मुझे लगता है कि मुझे एडीएल एक अपवाद होने की उम्मीद है, जो एक अधिक रिमोट नेमस्पेस में कड़ाई से बेहतर मिलान खोजने के लिए प्रयोग किया जाता है। जवाब यह एक गलतफहमी होने के लिए दिखाते हैं। – Sebastian
मेरा सवाल यह है कि एडीएल 'बूस्ट :: एल्गोरिदम' के अंदर एक फ़ंक्शन क्यों ढूंढ रहा है जब तर्क वैश्विक नामस्थान में एक वर्ग है, जो 'बूस्ट :: विवरण' नामस्थान में किसी वर्ग से प्राप्त होता है ... और उत्तर एक है ' 'हेडर में एल्गोरिदम :: find' का उपयोग करके' फ़ंक्शन 'को' बूस्ट 'नेमस्पेस में लाता है। क्या यह एक दोष हो सकता है? क्या यह कम से कम वैकल्पिक नहीं होना चाहिए? –