2014-10-23 3 views
7

कर बीच क्या अंतर है:"मित्र संरचना ए;" के बीच क्या अंतर है और "दोस्त ए;" वाक्य - विन्यास?

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

और

struct A; 
struct B { friend A; }; 

क्या यह दूसरे भाग में struct बाहर छोड़ने के लिए क्या मतलब है?

+0

कुछ भी नहीं है, यह देखते हुए स्निपेट आपके द्वारा दिए गए:टेम्पलेट पैरामीटर है। – Sneftel

+1

दूसरे कोड स्निपेट के लिए, मैं कहना चाहता था कि 'एक शून्य foobar (int, double) परिभाषित करें' लेकिन 'स्ट्रक्चर ए' की पूर्ववर्ती घोषणा, उस (आधे) मजाक को अमान्य करती है। एह। – quetzalcoatl

+0

यदि आप प्रस्तावित शीर्षक परिवर्तन से सहमत नहीं हैं, तो मुझे पुनः प्रयास करने में संकोच न करें। मैंने सोचा कि मूल शीर्षक अधिक पसंद आया .. किशोर सहकर्मी-समर्थन मंच: | शायद यह सिर्फ मुझे है .. – quetzalcoatl

उत्तर

13

अंतर यह है कि यदि आप friend A; लिखते हैं, A एक ज्ञात प्रकार का नाम होना चाहिए, जिसे पहले घोषित किया जाना चाहिए।

आप friend struct A; लिखते हैं, यह अपने आप में A की घोषणा है, इसलिए कोई पूर्व घोषणा की आवश्यकता नहीं:

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

वहाँ कई बारीकियों हालांकि रहे हैं। उदाहरण के लिए, friend class/struct A वर्ग B के अंतरतम संलग्नित नाम स्थान में वर्ग A वाणी (Captain Obvlious करने के लिए धन्यवाद):

  1. A एक है:

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

    इसके अलावा कई अन्य मामलों के लिए जब आप लिख सकते हैं केवल friend A हैं टाइपिफ़-नाम:

    class A; 
    typedef A A_Alias; 
    
    struct B { 
        // friend class A_Alias; - ill-formed 
        friend A_Alias; 
    }; 
    
  2. जो भी

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

आईआईआरसी, बाद में आप पूर्ण 'मित्र टाइपनाम ए' का उपयोग कर सकते हैं? – quetzalcoatl

+0

@quetzalcoatl no, [आप नहीं कर सकते] (http://coliru.stacked-crooked.com/a/f080bdde9d602ac1), आप शायद इसे [इस] के साथ भ्रमित कर रहे हैं (http://coliru.stacked-crooked.com/ए/818df2034d15bcf6) –

+0

@CaptainObvlious इस बात को इंगित करने के लिए धन्यवाद, मैंने जवाब अपडेट किया। –

संबंधित मुद्दे