سؤال

بالنظر إلى الرمز التالي:

 void f()
 {
     class A
     {
         template <typename T>
         void g() {}
     };
 }

G ++ 4.4 (وكذلك g++-4.6 -std=gnu++0x) يشكو: "إعلان غير صالح لقالب الأعضاء في الفصل المحلي".

على ما يبدو ، لا يُسمح للفصول المحلية بوجود أعضاء في القالب. ما هو الغرض من هذا القيد؟ هل سيتم إزالته في C ++ 0x؟

ملاحظة: إذا جعلت الفصل المحلي نفسه قالبًا ، بدلاً من إعطائه عضوًا في القالب:

 void f()
 {
     template <typename T>         
     class A
     {
         void g() {}
     };
 }

أحصل على "خطأ: لا يمكن أن يظهر إعلان قالب في نطاق الكتلة".

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

المحلول

الغرض من هذا القيد؟ مجرد تخمين ، ولكن:

  • يمكنك استخدام وظيفة عضو فئة/قالب القالب فقط ضمن وظيفة الأرفق. لذلك ، فأنت تعرف بالفعل جميع الأنواع المستخدمة داخل الوظيفة ، وبالتالي يمكنك تحديد الأنواع المستخدمة مباشرة (لعدة أنواع ، بالطبع ، كان متغير القالب قد حفظ بعض الكتابة).
  • على الرغم من أنه قد لا يبدو الأمر كذلك ، إلا أنه يعمل لجميع منشئي المترجمات ومساحة الحشرات ، وبالتالي يجب أن يكون هذا الجهد.

حقيقة ممتعة: حاول استخدام فئة محلية ضمن وظيفة كنوع إرجاع لـ (C ++ 0x) -lambda وظيفة تم الإعلان عنها في الوظيفة: MSVC 2010: خطأ في المترجم الداخلي ^ ^.

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