الغموض في توضيح الوراثة المتعددة
عند التعامل مع الوراثة المتعددة باستخدام فئات قاعدة القالب، تنشأ مشكلة محتملة فيما يتعلق بحل وظيفة العضو الغامض. خذ بعين الاعتبار السيناريو التالي:
template
class Base {
public:
template
typename std::enable_if::value>::type foo() {
std::cout هنا، الدالة foo() قابلة للاستدعاء فقط عندما تتطابق معلمة القالب مع أحد الأنواع الموجودة في حزمة الأنواع. الآن، إذا ورثت فئة مشتقة من فئات أساسية متعددة مع مجموعات أنواع غير متداخلة، فقد يواجه المترجم غموضًا عند حل استدعاء foo().
struct Derived: public Base,
public Base
{};
في هذه الحالة، من الأفضل أن يستدعي الاستدعاء Derived().foo() وظيفة العضو foo() من Base. ومع ذلك، فإن كلا من دول مجلس التعاون الخليجي وكلانج يبلغان عن وجود غموض.
لماذا لا يستطيع المترجم حل الغموض
ينشأ خطأ الترجمة بسبب قواعد الدمج للبحث عن وظيفة العضو. وفقًا لمعيار C، إذا لم يتم الإعلان عن وظيفة العضو في الفئة المشتقة نفسها، فإن عملية البحث تبحث في الفئات الأساسية بدورها. ومع ذلك، إذا اختلفت مجموعات التصريح في الفئات الأساسية، يصبح الدمج غامضًا.
في السيناريو المحدد، لا تعلن الفئة المشتقة المشتقة عن foo() بشكل صريح، لذلك يجب على المترجم دمج مجموعات البحث من فئتين أساسيتين. نظرًا لأن الفئات الأساسية تحتوي على مجموعات تعريف مختلفة لـ foo()، فإن الدمج يؤدي إلى الغموض.
الحلول
لحل هذا الغموض، أحد الخيارات هو استخدام استخدام الإعلانات في الفئة المشتقة لاستيراد وظائف العضو المطلوبة بشكل صريح. ومع ذلك، يتطلب هذا من المستخدم إضافة هذه الإعلانات، والتي يمكن أن تكون مطولة وغير عملية لقوائم الأنواع الكبيرة.
struct Derived: public Base,
public Base
{
using Base::foo;
using Base::foo;
};
بدلاً من ذلك، يمكن للمرء استخدام فئة مساعدة تجمع وتدمج وظائف الأعضاء من جميع الفئات الأساسية، مما يسمح للفئة المشتقة بالوصول إليها مباشرة.
template
struct BaseCollector : Bases...
{
using Bases::foo...;
};
struct Derived : BaseCollector , Base>
{};
بهذا الأسلوب، لا يحتاج المستخدم إلى إضافة أي إعلانات إضافية لحل الغموض. تقوم فئة BaseCollector بدمج مجموعات التصريح من جميع الفئات الأساسية بشكل فعال، مما يجعل الدالة foo() متاحة للفئة المشتقة دون أي غموض.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3