जब आप एक std::set
बनाते हैं, तो एक टेम्प्लेट पैरामीटर class Compare
होता है, जो डिफ़ॉल्ट रूप से std::less<T>
होता है।
अब, भले ही आप std::less<T>
की विशेषज्ञता न दें, फिर भी T::operator<
को परिभाषित करना C++ के लिए "इसका पता लगाने" के लिए पर्याप्त है। लेकिन सी ++ कुछ भी नहीं समझ रहा है, एक कंपाइलर है।
और संकलक एक श्रृंखला के माध्यम से जा रहा है जो मुझे यकीन है कि सरल कदम हैं। वे कदम क्या हैं?
2 जवाब
मानक पुस्तकालय को इस तरह परिभाषित किया गया है कि std::less<T>
operator<
का उपयोग करेगा जब तक कि अन्यथा विशिष्ट न हो। इसलिए यदि आप विशेषज्ञता प्रदान नहीं करते हैं, यदि प्रकार <
का समर्थन करता है तो यह काम करेगा।
std::less<T>
से :
तुलना करने के लिए फ़ंक्शन ऑब्जेक्ट। जब तक विशिष्ट न हो,
operator<
कोT
प्रकार पर आमंत्रित करता है।
और std::less<T>::operator()
के लिए:
संभावित कार्यान्वयन:
constexpr bool operator()(const T &lhs, const T &rhs) const
{
return lhs < rhs;
}
जैसा कि आप देख सकते हैं, यह केवल lhs < rhs का परिणाम देता है।
संकलक std::less<T>
के बजाय std::less<void>
को कैसे बांधना जानता है, ऐसा इसलिए है क्योंकि std::less<T>
की कोई विशेषज्ञता स्पष्ट रूप से नहीं लिखी गई है। इसलिए जब आप इसे मांगते हैं, तो यह स्वतः ही उत्पन्न होना चाहिए।
तो संकलक को std::less<>
के बजाय std::less<void>
क्यों मिलता है? ऐसा इसलिए है क्योंकि जब आप std::less
को कोई टेम्प्लेट पैरामीटर पास नहीं करते हैं तो आपको std::less<void>
मिलता है।
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।