Apakah nama kelas yang sepenuhnya memenuhi syarat hingga lingkup global pernah diperlukan untuk definisi fungsi anggota out-of-line?

14

Pertanyaan ini membuat saya bertanya-tanya apakah pernah berguna / perlu untuk sepenuhnya memenuhi syarat nama kelas (termasuk operator lingkup global) dalam definisi fungsi anggota di luar kelas.

Di satu sisi, saya belum pernah melihat ini dilakukan sebelumnya (dan sintaksis untuk melakukannya tampaknya tidak jelas). Di sisi lain, pencarian nama C ++ sangat tidak sepele, jadi mungkin ada kasus sudut.

Pertanyaan:

Apakah pernah ada kasus di mana memperkenalkan definisi fungsi anggota di luar kelas dengan
ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
berbeda dari
ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }(tidak ada ::awalan lingkup global )?

Perhatikan bahwa definisi fungsi anggota harus dimasukkan ke dalam namespace yang menyertakan kelas, jadi ini bukan contoh yang valid.

Max Langhof
sumber
Sangat ingin tahu apa yang tidak disukai downvoter tentang pertanyaan ini. Selamat datang!
Max Langhof
ketika definisi ditempatkan di namespace yang berbeda dari deklarasi? Itulah yang ada dalam pikiran saya untuk pertanyaan yang Anda tautkan
idclev 463035818
oops, tidak membaca cetakan kecil;)
idclev 463035818
@ mantanlyknownas_463035818 Itu juga yang ada dalam pikiran saya, kemudian saya mencobanya dan menyadari itu tidak akan berhasil, jadi saya menulis pertanyaannya (mencari tahu orang lain juga akan bertanya-tanya).
Max Langhof

Jawaban:

12

Sebuah menggunakan-direktif dapat menyebabkan Fullymenjadi ambigu tanpa kualifikasi.

namespace Foo {
    struct X {
    };
}

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

void X::c() { } // ambiguous
void ::X::c() { } // OK
TC
sumber
5

Ini penting jika seseorang adalah seorang masokis dan suka menulis hal-hal seperti ini

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

   struct bar {
       void baz();
   };

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

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

Seseorang tentu saja dapat menulis kelebihan kedua seperti foo::foo::bar::bazdalam lingkup global, tetapi pertanyaannya adalah apakah kedua deklarasi tersebut dapat memiliki makna yang berbeda. Saya tidak akan merekomendasikan menulis kode seperti itu.

StoryTeller - Unslander Monica
sumber
Ya, ini memang jawaban yang valid, dan bahkan tidak perlu a using. Senang memiliki berbagai kasus yang disorot!
Max Langhof
2

Jika direktif menggunakan digunakan maka mungkin ada kode yang membingungkan.

Pertimbangkan program demonstratif berikut

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

Jadi untuk keterbacaan nama yang memenuhi syarat ini

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

menunjukkan dengan tepat di mana fungsi tersebut dideklarasikan.

Vlad dari Moskow
sumber