البرمجة

استخدام using في الوراثة من الفئات القالبية

في الكود الأول، تحاول استخدام تعليمة using لإرث عامل تحويل من الفئة الأساسية B في فئة X المستخدمة كقالب، حيث يتم تحديد نوع العامل تحويل T باعتباره قالبًا.

GCC يقبل الكود لأنه يعتبر أن T في using B::operator T; هو نوع قالب، ويقبل هذا النوع من الاستخدام.

بينما Clang و MSVC يرفضان الكود لأنهما يعتبران أن T لا يمكن أن يكون نوع قالب في هذه الحالة. يفسران T كنوع ثابت، وبالتالي يعتبران الاستخدام غير صحيح.

الكود الثاني يعمل لأنه يستخدم T كنوع ثابت في تحديد الفئة الأساسية B، وبالتالي يتم قبول الاستخدام الذي يستخدم B::operator T كنوع ثابت.

بشكل عام، يجب أن تكون تعليمة using قادرة على استخدام نوع القالب كنوع قالب ما لم يتم تحديده بشكل صريح كنوع ثابت.

المزيد من المعلومات

تحديداً، هناك تباين بين مترجمي C++ في كيفية تفسيرهم لاستخدام using مع أعضاء قالب من الفئة الأساسية في الفئة المشتقة.

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

مترجمي Clang و MSVC، من ناحية أخرى، يفسرون القواعد بشكل مختلف ويعتبران أن T في using B::operator T; هو نوع ثابت، وبالتالي لا يسمحان بذلك الاستخدام إذا كان النوع غير معروف في هذه المرحلة.

بشكل عام، يفسر القانون الأساسي للتفسير الموحد للتعليمات المستخدمة بشكل عام. ومع ذلك، هناك تفسيرات مختلفة يمكن أن تؤدي إلى تباين في السلوك في بعض الحالات، وهذا يعتمد على الترجمة المستخدمة.

زر الذهاب إلى الأعلى