मैं क्षमा चाहता हूं कि इस प्रश्न का शीर्षक सहायक से कम है; मैं निम्न उदाहरण दिए बिना इस सवाल पूछने के लिए एक संक्षिप्त रास्ता पता नहीं है:विभिन्न नामस्थान से टेम्पलेट टेम्पलेट तर्क एक दोस्त हो सकता है?
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_;
};
}
आप देख सकते हैं, Arg2
Arg1
की एक प्रति है। हालांकि, 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_
सार्वजनिक किया गया है, तो यह सब ठीक काम करता है, इसलिए यह दोस्ती मुद्दा लगता है।
टेम्पलेट टेम्पलेट तर्क एक अलग नामस्थान में होने पर दोस्ती घोषणा विफल होने का कारण क्या है?
मैं जोड़ने चाहिए कि एक ही कोड भी अन्य (अब नष्ट कर दिया) यह दर्शाता है कि बजना और जीसीसी त्रुटियों के बिना मेरी उदाहरण संकलन टिप्पणियों को देखते हुए दोनों वी.एस. 2010 और वी.एस. 2012 –