Hat dışı üye işlev tanımları için tam kapsamlı bir sınıf adı hiç küresel kapsam gerektiriyor mu?


14

Bu soru, sınıf dışı üye işlev tanımında sınıf adlarının (genel kapsam operatörü dahil) tam olarak nitelendirilmesinin hiç yararlı / gerekli olup olmadığını merak etmemi sağladı.

Bir yandan, bunu daha önce hiç görmedim (ve düzgün yapmak için sözdizimi belirsiz görünüyor). Öte yandan, C ++ ad araması çok önemsizdir, bu nedenle belki bir köşe durumu vardır.

Soru:

Sınıf dışı üye işlev tanımının tanıtılmasının (genel kapsam öneki yok) ile
ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
farklılık göstereceği hiç bir durum var mı ?
ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }::

Böylece üye işlev tanımları, sınıf kapatan bir ad konması gerekir bu geçerli bir örnek değildir.


Downvoter'ın bu soru hakkında neyi sevmediğini çok merak ediyorum. Geribildirim hoş geldiniz!
Max Langhof

tanım, bildiriden farklı bir ad alanına yerleştirildiğinde? Thats you quesiton için aklımda ne vardı link
idclev 463035818

ayy, küçük izi okumadım;)
idclev 463035818

Aklımda da vardı, o zaman denedim ve işe yaramayacağını anladım, bu yüzden soruyu yazdım (başkalarının da merak edeceğini düşünerek).
Max Langhof

Yanıtlar:


12

Bir kullanma direktifiFully yeterlilik olmadan belirsizliğe neden olabilir .

namespace Foo {
    struct X {
    };
}

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

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

5

Biri mazoşistse ve bunun gibi şeyler yazmaktan hoşlanıyorsa gereklidir

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

   struct bar {
       void baz();
   };

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

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

Tabii ki foo::foo::bar::bazküresel aşırı yükte olduğu gibi ikinci aşırı yük de yazılabilir , fakat soru iki bildirimin farklı bir anlama sahip olup olamayacağıydı. Böyle bir kod yazmanızı tavsiye etmem.


Evet, bu gerçekten geçerli bir cevap ve hatta a gerek yok using. Vurgulanan farklı davaları olması güzel!
Max Langhof

2

Eğer kullanma talimatı kullanılırsa kafa karıştırıcı bir kod olabilir.

Aşağıdaki örnek programı düşünün

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

Okunabilirlik için bu nitelikli ad

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

tam olarak fonksiyonun nerede bildirildiğini gösterir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.