ชื่อคลาสที่ผ่านการรับรองโดยสมบูรณ์ถึงขอบเขตทั่วโลกที่จำเป็นสำหรับคำจำกัดความของฟังก์ชั่นสมาชิกนอกบรรทัดหรือไม่?


14

คำถามนี้ทำให้ฉันสงสัยว่ามันมีประโยชน์ / จำเป็นสำหรับชื่อคลาสที่มีคุณสมบัติครบถ้วน (รวมถึงตัวดำเนินการขอบเขตทั่วโลก) ในนิยามฟังก์ชันฟังก์ชันสมาชิกนอกคลาสหรือไม่

ในมือข้างหนึ่งฉันไม่เคยเห็นสิ่งนี้มาก่อน (และไวยากรณ์ในการทำอย่างถูกต้องดูเหมือนคลุมเครือ) ในอีกด้านหนึ่งการค้นหาชื่อ C ++ นั้นไม่ใช่เรื่องเล็กน้อยดังนั้นอาจมีกรณีเล็ก ๆ น้อย ๆ

คำถาม:

มีกรณีที่แนะนำคำนิยามฟังก์ชั่นสมาชิกนอกคลาสโดย
ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
จะแตกต่างจาก
ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }(ไม่มี::คำนำหน้าขอบเขตทั่วโลก)?

โปรดทราบว่าคำจำกัดความของฟังก์ชันสมาชิกจะต้องใส่ไว้ในเนมสเปซที่ล้อมรอบคลาสดังนั้นนี่ไม่ใช่ตัวอย่างที่ถูกต้อง


อยากรู้อยากเห็นมากสิ่งที่ downvoter ไม่ชอบเกี่ยวกับคำถามนี้ ข้อเสนอแนะยินดีต้อนรับ!
Max Langhof

เมื่อความหมายถูกวางในเนมสเปซที่แตกต่างจากการประกาศ? นั่นคือสิ่งที่ฉันมีในใจสำหรับลิงก์ที่คุณต้องการ
idclev 463035818

อ๊ะไม่อ่าน smallprint;)
idclev 463035818

@ ก่อนหน้านี้ที่รู้จักกัน _463035818 นั่นคือสิ่งที่ฉันมีอยู่ในใจจากนั้นฉันลองและตระหนักว่ามันใช้งานไม่ได้ดังนั้นฉันจึงเขียนคำถาม (การคิดว่าคนอื่นจะสงสัยเช่นกัน)
Max Langhof

คำตอบ:


12

การใช้คำสั่งสามารถทำให้เกิดFullyความคลุมเครือโดยไม่มีคุณสมบัติ

namespace Foo {
    struct X {
    };
}

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

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

5

มันจำเป็นถ้ามีนักทำโทษตนเองและสนุกกับการเขียนสิ่งนี้

namespace foo {
    namespace foo {
        struct bar {
            void baz();
        };
    }

   struct bar {
       void baz();
   };

   void foo::bar::baz() {
   }

   void (::foo::bar::baz)() {
   }
} 

แน่นอนหนึ่งสามารถเขียนเกินพิกัดที่สองเช่นเดียวกับfoo::foo::bar::bazในขอบเขตทั่วโลก แต่คำถามคือว่าทั้งสองประกาศสามารถมีความหมายที่แตกต่างกันหรือไม่ ฉันจะไม่แนะนำให้เขียนรหัสดังกล่าว


usingใช่นี้ย่อมเป็นคำตอบที่ถูกต้องและไม่จำเป็นต้องแม้กระทั่ง ยินดีที่ได้มีการเน้นกรณีที่แตกต่างกัน!
Max Langhof

2

หากใช้คำสั่งการใช้งานอาจมีรหัสที่ทำให้เกิดความสับสน

พิจารณาโปรแกรมสาธิตต่อไปนี้

#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"; }

แสดงให้เห็นอย่างแม่นยำในตำแหน่งที่ประกาศฟังก์ชั่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.