c++ - क्या आउट-ऑफ-लाइन सदस्य फ़ंक्शन परिभाषाओं के लिए वैश्विक स्कोप के लिए पूरी तरह से योग्य वर्ग का नाम आवश्यक है?




name-lookup global-scope (2)

एक का उपयोग-निर्देश Fully से योग्यता के बिना अस्पष्ट हो सकता है।

namespace Foo {
    struct X {
    };
}

using namespace Foo;
struct X {
    void c();
};

void X::c() { } // ambiguous
void ::X::c() { } // OK

This प्रश्न ने मुझे आश्चर्यचकित कर दिया कि क्या क्लास के नामों (वैश्विक स्कोप संचालक सहित) को एक आउट-ऑफ-क्लास सदस्य फ़ंक्शन परिभाषा में पूरी तरह से योग्य बनाने के लिए यह कभी भी उपयोगी / आवश्यक है।

एक तरफ, मैंने ऐसा पहले कभी नहीं देखा (और ठीक से ऐसा करने के लिए वाक्यविन्यास अस्पष्ट है)। दूसरी ओर, C ++ नाम देखने में बहुत ही गैर-तुच्छ है, इसलिए शायद एक कोने का मामला मौजूद है।

सवाल:

क्या कभी ऐसा मामला सामने आया है, जिसमें किसी आउट-ऑफ-क्लास सदस्य फ़ंक्शन की परिभाषा पेश की गई हो
ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
से अलग होगा
ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... } (कोई वैश्विक स्कोप :: उपसर्ग)?

ध्यान दें कि सदस्य फ़ंक्शन परिभाषाओं को वर्ग को घेरने वाले एक नामस्थान में रखा जाना चाहिए, इसलिए this एक वैध उदाहरण नहीं है।


यदि एक निर्देश का उपयोग किया जाता है तो एक भ्रामक कोड हो सकता है।

निम्नलिखित प्रदर्शन कार्यक्रम पर विचार करें

#include <iostream>
#include <string>

namespace N1
{
    struct A
    {
        void f() const;
    };      
}

using namespace N1;

void A::f() const { std::cout << "N1::f()\n"; }

struct A
{
    void f() const;
};

void ::A::f() const { std::cout << "::f()\n"; }

int main() 
{
    N1::A().f();
    ::A().f();

    return 0;
}

तो पठनीयता के लिए यह योग्य नाम है

void ::A::f() const { std::cout << "::f()\n"; }

ठीक से दिखाता है कि फ़ंक्शन कहाँ घोषित किया गया है।







scope-resolution-operator