मैं एक बड़ी परियोजना पर काम कर रहा हूं, जिसमें संकलित कोड का एक अनुभाग शामिल है - लेकिन मुझे समझ में नहीं आता कि कैसे। मैं इसे इस सरल उदाहरण के लिए नीचे आसुत:यह टेम्पलेट कोड संकलित क्यों करता है?
template <typename T>
struct First {
typedef int type; // (A)
typename T::Three order; // (B)
};
template <typename T> struct Second {
typedef typename T::type type;
};
template <typename T> struct Third {
int val;
T two;
};
struct Traits {
typedef First<Traits> One;
typedef Second<One> Two;
typedef Third<Two> Three;
};
int main(int argc, char** argv) {
Traits::One x;
};
वर्ग First
पर Traits
और संदर्भ Traits::Three
, टेम्प्लेट की गई है जो अपने आप में एक typedef
पर Two
आधारित है जो एक typedef
पर First<Traits>
आधारित है, ... इसलिए यह परिपत्र है । लेकिन यह कोड gcc4.6 और VC10 दोनों पर ठीक संकलित करता है। हालांकि, अगर मैं (A)
और (B)
चिह्नित दो पंक्तियों के क्रम को फ़्लिप करता हूं, तो कोड Second
के अंदर typedef
के बारे में शिकायत नहीं करता है।
यह कोड क्यों संकलित करता है, और यह क्यों है कि typedef
और सदस्य परिवर्तनीय मामलों का आदेश क्यों है?
कोशिश इस तरह एक पेड़ में कागज पर यह आकर्षित करने के लिए: प्रत्येक परिभाषा के लिए एक नोड बनाने, और प्रत्येक (आगे) प्रकार की घोषणा, और उसके बाद के लिए जो के लिए एक पूर्ण परिभाषा की जरूरत है और जो एक की जरूरत है किनारों आकर्षित केवल घोषणा, और आप देखेंगे कि यह परिपत्र नहीं होगा। – PlasmaHH
हाय - असंबंधित, लेकिन क्या आपको पता है कि पी 0704 17 के खिलाफ एक डीआर है? –
@ केरेक कोई विचार नहीं, मुझे यह भी नहीं पता कि इस तरह की चीजें कैसे तय की जाती हैं। – Barry