C ++ के C + 20 मानक तक, जब हम एक आउट-ऑफ-क्लास ऑपरेटर को परिभाषित करना चाहते थे जो टेम्पलेट क्लास के कुछ निजी सदस्यों का उपयोग करता है, तो हम इसके समान एक निर्माण का उपयोग करेंगे:
template <typename T>
class Foo;
template <typename T>
constexpr bool operator==(T lhs, const Foo<T>& rhs);
template <typename T>
class Foo {
public:
constexpr Foo(T k) : mK(k) {}
constexpr friend bool operator==<T>(T lhs, const Foo& rhs);
private:
T mK;
};
template <typename T>
constexpr bool operator==(T lhs, const Foo<T>& rhs) {
return lhs == rhs.mK;
}
int main() {
return 1 == Foo<int>(1) ? 0 : 1;
}
C ++ 20 के बाद से, हम आउट-ऑफ-क्लास घोषणा को छोड़ सकते हैं, इस प्रकार आगे की घोषणा भी, इसलिए हम बस के साथ दूर हो सकते हैं:
template <typename T>
class Foo {
public:
constexpr Foo(T k) : mK(k) {}
constexpr friend bool operator==<T>(T lhs, const Foo& rhs);
private:
T mK;
};
template <typename T>
constexpr bool operator==(T lhs, const Foo<T>& rhs) {
return lhs == rhs.mK;
}
अब, मेरा प्रश्न यह है कि C ++ 20 का कौन सा भाग हमें ऐसा करने की अनुमति देता है? और यह पहले के सी ++ मानकों में क्यों संभव नहीं था?
जैसा कि टिप्पणियों में बताया गया था, क्लैंग डेमो में प्रस्तुत इस कोड को स्वीकार नहीं करता है, जो बताता है कि यह वास्तव में जीसीसी में बग हो सकता है।
मैंने gcc के बगज़िला पर एक बग रिपोर्ट दर्ज की
"c string" == Foo<std::string>("foo"))) से परहेज करता हूं ।