स्टैंडर्ड पते इस सीधे ही जगह यह उपयोगकर्ता परिभाषित शाब्दिक की घोषणाओं पर कोई प्रतिबंध का उल्लेख है, §13.5.8/2 में:
एक जिसका declarator-आईडी घोषणा एक शाब्दिक-ऑपरेटर है -इड्स नामस्थान-स्कोप फ़ंक्शन या फ़ंक्शन टेम्पलेट की घोषणा होगी (यह एक मित्र फ़ंक्शन (11.3)) हो सकता है, एक स्पष्ट तत्काल या फ़ंक्शन टेम्पलेट का विशेषज्ञता, या उपयोग-घोषणा (7.3.3)।
यदि मित्र को नामस्थान क्षेत्र में भी घोषित किया गया है, तो कक्षा या नामस्थान क्षेत्र में परिभाषा के बीच कोई अंतर नहीं है। ध्यान दें कि नेमस्पेस स्कोप पर परिभाषा के लिए कोई आवश्यकता नहीं है, जो वर्तमान में आपके प्रश्न के रूप में आपका प्रश्न है।
यदि नामस्थान क्षेत्र में घोषित नहीं किया गया है, क्योंकि यह एडीएल द्वारा नहीं पाया जा सकता है, तो मित्र को कक्षा के अंदर निजी रूप से इस्तेमाल किया जा सकता है जहां यह नियमित रूप से अयोग्य नाम लुकअप द्वारा गुंजाइश है। एक शाब्दिक ऑपरेटर घोषित करने का यही एकमात्र तरीका है जो बाहरी इंटरफ़ेस नहीं है।
यदि मित्र को क्लास टेम्पलेट के अंदर परिभाषित किया गया है, तो टेम्पलेट के दो इंस्टॉलेशनेशन नामस्थान स्कोप पर दो समान नामित फ़ंक्शंस उत्पन्न करेंगे, जो कि क्लास स्कोप के बाहर दोनों अदृश्य हैं, भले ही टकरा जाए।
class Integer;
namespace literals {
Integer operator "" _I (const char *);
}
// Infinite precision integer
class Integer {
public:
// Basic constructor & destructor
Integer();
~Integer();
... rest of the interface ...
// Literal operator
friend Integer literals::operator "" _I (const char *);
private:
struct Detail;
std::unique_ptr<Detail> detail;
};
उपयोगकर्ताओं को एक साथ ऑपरेटर में खींच:
मैंने वास्तव में सोचा कि मैंने इसे कहीं पढ़ा है, प्रत्यय * * केवल ** नामस्थान ** के अंदर घोषित किया जाना चाहिए। मुझे याद नहीं है - लेकिन यह केवल एक सुझाव था, आवश्यकता नहीं। और इसलिए, यह शायद "अच्छी प्रथा" के लिए एकमात्र युक्ति थी। ** टेम्पलेट ** मित्र समारोह के बारे में अच्छा बिंदु। यह सामान्य * मित्र * पैटर्न के साथ कोई मुद्दा नहीं है, मित्र समारोह में कम से कम एक तर्क क्या एक वर्ग उदाहरण है - तब कोई नामकरण समस्या नहीं है। – towi
मुझे पहले की स्थिति के कागजात में ऐसा कुछ याद रखना याद है। N2378.pdf अनुभाग 5 का प्रयास करें: एक मुहावरे। यहां वे कहते हैं: 1. ये कार्य एडीएल के माध्यम से नहीं पाए जाते हैं जब स्पष्ट ऑपरेटर फॉर्म के बजाय अक्षर के माध्यम से बुलाया जाता है। 2. यह वैश्विक में नियुक्ति का लुत्फ उठाएगा। 3. इससे कोड में भी संघर्ष हो सकता है जो शाब्दिक उपयोग नहीं करता है। 4. तो शाब्दिक ओप को एक नामस्थान में रखें और उन्हें वैश्विक स्तर पर खींचने के लिए एक निर्देश का उपयोग करें। – emsr
मैं सिर्फ यह ध्यान रखना चाहता था कि आप वर्ग के अंदर निजी रूप से मित्र समारोह का उपयोग नहीं कर सकते हैं, [यह सवाल] देखें (http://stackoverflow.com/questions/8207633/whats-the-scope-of-inline-friend -functions)। – Xeo