2012-12-16 16 views
6

göre 7.3.1.2 için ad alanı üyesi tanımları 14882: 2003 (E)C++ İleri Deklarasyonu ve ad alanında Dostluk C++ Standart ISO/IEC

öncelikle bir ad alanında bildirilen her isim o ad üyesidir . Yerel olmayan bir sınıfta bir arkadaş bildirimi ilk olarak bir sınıfı veya işlevi bildirir (bu, sınıfın adını veya işlevinin niteliksiz olduğunu gösterir) arkadaş sınıfı veya işlevi en içteki kapsayıcı ad alanı olan öğesinin üyesidir. void h(int); yana

// Assume f and g have not yet been defined. 
void h(int); 
template <class T> void f2(T); 
namespace A { 
    class X { 
    friend void f(X); // A::f(X) is a friend 
     class Y { 
     friend void g(); // A::g is a friend 
     friend void h(int); // A::h is a friend 
     // ::h not considered 
     friend void f2<>(int); // ::f2<>(int) is a friend 
     }; 
    }; 
    // A::f, A::g and A::h are not visible here 
    X x; 
    void g() { f(x); } // definition of A::g 
    void f(X) { /* ... */} // definition of A::f 
    void h(int) { /* ... */ } // definition of A::h 
    // A::f, A::g and A::h are visible here and known to be friends 
} 

ilk genel ad alanında bildirilmiş, bu genel ad üyesidir. class Y numaralı telefondaki friend void h(int); arkadaş bildirimi neden ::h yerine A::h mu?

+0

Sadece X sınıfında boş bir arkadaş ilan ediyorsunuz. Eğer başka bir şey yaptıysa endişelenirdim. void h (int) Daha önce bildirilenler globaldir ama Y açıkça A adındadır. – Jay

cevap

2

belirtir:

bir sınıfın bir önceki beyanı veya arkadaş olarak bildirilen bir işlevden ve arayan arkadaş sınıf veya işlevinin adı olduğunda ne Nitelikli bir ad veya bir şablon kimliği, en içteki ek alan adının dışındaki kapsamlar dikkate alınmaz.

::h kabul edilmez nedeni budur: Bu nitelikli isim ne de bir şablon kimliği de değildir. Bu da ':: f2`'nin neden kabul edildiğidir, çünkü bu bir şablon kimliğidir.

1

İç beyannamelerin küresel isim alanındakileri gölgelediğini düşünüyorum. Ayrıca, arkadaş beyanları kendilerini ileriye dönük beyanlardır, bu yüzden küresel isim alanındakileri gölgelediler ve bu işlevlere sadece "gönderme" yapmazlar. Bir ad, bir iç içe bildirime bölgede, aynı adla açık beyanı veya türetilmiş bir sınıf (10.2) ile gizlenebilir

: N3485 içinde 3.3.10.1 "adı saklama" atfen

.

11.3.4 Arkadaşlar:

ilk arkadaş bildiriminde bildirilen bir işlev harici bağlantı (3.5) sahiptir. Aksi halde, işlev önceki bağlantılarını korur (7.1.1).

3.5.2 bakıldığında: bir isim dış bağlantı olduğunda

, bu belirtmektedir işletme olabilir diğer çeviri birimleri ya da bunun diğer sahasından sahasından isimler çeviri birimi. paragrafın sonunda