سؤال

لا أحد يعرف لماذا استخدام الإعلانات لا يبدو أن العمل بالنسبة استيراد أسماء نوع من تعتمد على قاعدة الطبقات ؟ أنها تعمل على الأعضاء المتغيرات والوظائف ، ولكن على الأقل في دول مجلس التعاون الخليجي 4.3 ، يبدو أنهم تجاهل أنواع.

template <class T>
struct Base
{
  typedef T value_type;
};

template <class T>
struct Derived : Base<T>
{
  // Version 1: error on conforming compilers
  value_type get();

  // Version 2: OK, but unwieldy for repeated references
  typename Base<T>::value_type get();

  // Version 3: OK, but unwieldy for many types or deep inheritance
  typedef typename Base<T>::value_type value_type;
  value_type get();

  // Version 4: why doesn't this work?
  using typename Base<T>::value_type;
  value_type get(); // GCC: `value_type' is not a type
};

لدي قاعدة الطبقة مع مجموعة من مخصص الطراز typedefs أود أن ترث جميع أنحاء عدة مستويات من الميراث.أفضل حل لقد وجدت حتى الآن هو الإصدار 3 أعلاه ، ولكن أنا الغريب لماذا الإصدار 4 لا يبدو أن العمل.دول مجلس التعاون الخليجي يقبل باستخدام الإعلان ، ولكن يبدو أن تجاهل ذلك.

لقد راجعت C++, C++ Prog.لانغ.3rd ed.[Stroustrup] و C++ قوالب [Vandevoorde, Josuttis], ولكن لا شيء يبدو على ما إذا كان استخدام الإعلانات يمكن تطبيقها تعتمد على قاعدة الطبقة أنواع.

في حالة أنه يساعد على رؤية مثال آخر ، هنا هو نفس السؤال الذي طرح, ولكن ليس حقا أجاب على دول مجلس التعاون الخليجي القائمة البريدية.السائل يشير إلى أنه شهد 'باستخدام typename' في مكان آخر ، ولكن أن دول مجلس التعاون الخليجي لا يبدو أن الدعم لها.لا يكون آخر مطابقة مترجم المتاحة لاختبار ذلك.

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

المحلول

كما ريتشارد غوردون ، وقد تم تناول هذه المسألة في C++ القياسية الأساسية اللغة تقارير عيب بعد 2003 معيار تم التصديق عليها: كيف الكلمات الرئيسية typename/قالب التفاعل مع استخدام الإعلانات?

القرار المقترح (نيسان / أبريل 2003 ، المنقحة تشرين الأول / أكتوبر 2003):

إضافة فقرة جديدة إلى أسفل 7.3.3 [مساحة الاسم.udecl]:

إذا كان استخدام الإعلان يستخدم الكلمة typename و يحدد تعتمد اسم (14.7.2 [temp.dep]), اسم عرض استخدام الإعلان يتم التعامل مع الرموز المميزة ل typedef-اسم (7.1.3 [dcl.الرموز المميزة ل typedef]).

هذا النص لا يبدو أن تظهر في الطبعة الثانية القياسية من 15 أكتوبر 2003.

دول مجلس التعاون الخليجي لا بعد تنفيذ هذا القرار ، كما هو موضح في علة 14258:

------- تعليق رقم 3 من جيوفاني Bajo 2004-02-27 12:47 [رد] ------- على المشكلة هي أن لدينا USING_DECL لا سجل "typename" ، وهذا هو الواقع أن هذا هو النوع الذي هو المستوردة من خلال ذلك.هذا العمل بفضل الضمني اكتب اسم التمديد ، على ما أعتقد.

مكررة علة 21484 يشير إلى أن 'باستخدام typename' يعمل على كومو و Intel المجمعين.لأن MSVC يعامل جميع الأسماء كما تعتمد بناء لا لزوم لها (بل يجوز) أن المترجم.


ثابت في دول مجلس التعاون الخليجي 4.7 في Dec 13 2011!

نصائح أخرى

أنت لم تقم بتضمين محدد الوصول (العام / حماية / خاص) في قالب قاعدة قبل إعلان typedef وللقاعدة :: VALUE_TYPE. ونتيجة لذلك، لأنه تخلف عن القطاع الخاص وليس في متناول الفئات المشتقة من قاعدة.

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