سؤال

ولدي مصدر برنامج القديم هنا، حيث استخدموا المتغيرات عضو المحمية. أم لا هو فكرة جيدة يمكن مناقشة هذا الأمر. ومع ذلك، رمز يجب أن يكون جمعت ما يرام مع gcc3. لدي المستمدة قالب فئة بار يستخدم المحمية عضوا العاشر من قالب فئة فو مثل ذلك

template <class Something> class Foo {  
public:  
// stuff...  
protected:  
  some::type x;  
}

template <class Something> Bar : Foo<Something> {
public:
  void cleanup();
}

وفي الإعلان طريقة تنظيف () هناك شيء ما مع x

template <class Something> void Bar<Something>::cleanup() {
  doSomeThingCleanUpLike (x);
}

وهذا لا يعمل مع gcc4، على الرغم من أنه كان ينبغي أن عملت مع gcc3. وهو يعمل عندما أقوم بتغيير ل

doSomeThingCleanUpLike (this->x);

والسبب هو أن هذه القضية؟

هل كانت مفيدة؟

المحلول

ووx التعبير المستخدم في فئة مشتقة هو، وفقا للقواعد في المعيار، لا تعتمد على أي معلمة قالب من فئة مشتقة. وبسبب هذا، بحث يحدث في سياق تعريف القالب وليس عند نقطة الاستخدام / مثيل. على الرغم من أن الفئة الأساسية قالب من القالب يبدو أن تكون واضحة، لأنه من فئة القالب مثيل خاص التي يمكن استخدامها قد تنطوي على القوالب المتخصصة حتى تعريف قالب فئة أساسية لا يمكن استخدامها لاسم البحث.

وعن طريق تغيير التعبير إلى this->x كنت مما يجعلها تعتمد التعبير (this في قالب فئة يعتمد دائما على المعلمات القالب). وهذا يعني أن البحث سوف تحدث في سياق مثيل عند هذه النقطة الفئة الأساسية معروفة تماما وأعضائها مرئية.

نصائح أخرى

وعندما كنت تحديد قالب المشتقة، والمترجم لا يعرف سوى القالب قاعدة الطبقة 'اسم ولكن ليس تفاصيله، حتى المترجم لا يعرف فئة مشتقة لها عضو الموروثة. من أجل أن نقول المترجم من وجود عضو، استخدام this->، مثلما فعلت.

في الواقع، هو نسخة مكررة من هذا السؤال .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top