2014-10-23 8 views
7

yapmak arasındaki fark nedir:"Arkadaş yapısı A" arasındaki fark nedir? ve "arkadaş A;" sözdizimi?

struct A; 
struct B { friend struct A; }; 

ve

struct A; 
struct B { friend A; }; 

ikinci bölümünde struct dışarı bırakmak ne demektir?

+0

Hiçbir şey sağladığınız parçacıkları verilen:bir şablon parametresidir. – Sneftel

+1

İkinci kod snippet'ına gelince, #define Bir boşluk foobar (int, double) 'dır, ancak struct A'nın bir önceki ileri bildirimi, (yarım) şakayı geçersiz kılar. Eh. – quetzalcoatl

+0

Önerdiğim başlık değişikliğine katılmamanız durumunda, reedit için çekinmeyin. Sadece orijinal başlık daha çok benzediğini düşündüm .. genç akran desteği forum: | Belki bugün bu sadece benim .. – quetzalcoatl

cevap

13

Buradaki fark, friend A; yazıyorsa, A bilinen bir tür adı olmalıdır, bunun daha önce bildirilmesi gerekir. Eğer friend struct A; yazarsanız

, bu kendisi A ilanı, bu nedenle önceden hiçbir beyana gerek yoktur: Birkaç incelikler olsa vardır

struct B { friend struct A; }; // OK 

. Örneğin, friend class/struct A sınıfın B en iç kapsayan ad alanında sınıf A beyan (Captain Obvlious sayesinde):

  1. A bir geçerli:

    class A; 
    namespace N { 
        class B { 
         friend A;   // ::A is a friend 
         friend class A; // Declares class N::A despite prior declaration of ::A, 
              // so ::A is not a friend if previous line is commented 
        }; 
    } 
    

    Ayrıca sadece friend A yazabilirsiniz diğer bazı durumlar vardır typedef-adı:

  2. olursa olsun

    template<typename A> 
    struct B { 
        // friend class A; - ill-formed 
        friend A; 
    }; 
    
+0

IIRC, ikincisi, tam arkadaş türü A' kullanabilirsiniz? – quetzalcoatl

+0

@quetzalcoatl hayır, [sen olamaz] (http://coliru.stacked-crooked.com/a/f080bdde9d602ac1), muhtemelen [bu] (ile karıştırıyorsun http://coliru.stacked-crooked.com/a/818df2034d15bcf6) –

+0

@CaptainObvl Bu yazdığın için teşekkürler, cevabı güncelledim. –