2013-02-25 14 views
5

मैं क्षमा चाहता हूं कि इस प्रश्न का शीर्षक सहायक से कम है; मैं निम्न उदाहरण दिए बिना इस सवाल पूछने के लिए एक संक्षिप्त रास्ता पता नहीं है:विभिन्न नामस्थान से टेम्पलेट टेम्पलेट तर्क एक दोस्त हो सकता है?

template <template <class> class Arg> 
class C { 
    typedef C<Arg> type; 
    friend class Arg<type>; 
    public: 
    C() { 
     a_.set(this); 
    } 
    private: 
    int i_; 
    Arg<type> a_; 
}; 

template <class Type> 
class Arg1 { 
    public: 
    void set(Type* t) { 
     t_ = t; 
     t_->i_ = 1; 
    } 
    private: 
    Type* t_; 
}; 

namespace NS { 

    template <class Type> 
    class Arg2 { 
     public: 
     void set(Type* t) { 
      t_ = t; 
      t_->i_ = 2; 
     } 
     private: 
     Type* t_; 
    }; 

} 

आप देख सकते हैं, Arg2Arg1 की एक प्रति है। हालांकि, 2008 वी.एस. केवल अनुमति देता है Arg1 एक टेम्पलेट तर्क के रूप में प्रयोग की जाने वाली:

int main() { 
    C<Arg1> c1; // compiles ok 
    C<NS::Arg2> c2; // error C2248 

    return 0; 
} 

त्रुटि 'C<Arg>::i_' : cannot access private member declared in class 'C<Arg>' है। i_ सार्वजनिक किया गया है, तो यह सब ठीक काम करता है, इसलिए यह दोस्ती मुद्दा लगता है।

टेम्पलेट टेम्पलेट तर्क एक अलग नामस्थान में होने पर दोस्ती घोषणा विफल होने का कारण क्या है?

+0

मैं जोड़ने चाहिए कि एक ही कोड भी अन्य (अब नष्ट कर दिया) यह दर्शाता है कि बजना और जीसीसी त्रुटियों के बिना मेरी उदाहरण संकलन टिप्पणियों को देखते हुए दोनों वी.एस. 2010 और वी.एस. 2012 –

उत्तर

0

नेमस्पेस सदस्यता दोस्ती के लिए योग्यता को प्रभावित नहीं करती है। यह एक कंपाइलर बग है।

friend और namespace भाषा विशेषताएं हैं जो बातचीत करती हैं, हालांकि, यह विशेष रूप से आश्चर्यजनक नहीं है क्योंकि बग्स जाते हैं। शायद यह वास्तव में संलग्न नामस्थान, ::Arg2<type> में एक बकवास आगे घोषणा घोषित कर रहा है।

+0

में संकलित करने के लिए विफल रहता है, मैं सोच रहा हूँ कि यह सही है जवाब। –

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