لماذا لا يعمل SFINAE (enable_if) لوظائف الأعضاء في قالب الفصل؟
#include
struct A {};
struct B {};
template
struct Foo
{
typename std::enable_if<:is_same a>::value>::type bar()
{}
typename std::enable_if<:is_same b>::value>::type bar()
{}
};
في هذا المثال، يحدد Foo اثنين من وظائف الأعضاء المحملة بشكل زائد bar(). يتم تمكين التحميل الزائد الأول عندما يكون T هو A، ويتم تمكين الثاني عندما يكون T هو B. ومع ذلك، إذا حاولت ترجمة هذا الرمز، فستتلقى رسالة خطأ تشير إلى أنه لا يمكن حل التحميل الزائد.سبب هذا الخطأ هو أن SFINAE يعمل فقط مع وسيطات القالب المستنتجة. في حالة وظائف الأعضاء في قالب فئة، لا يتم استنتاج وسيطة القالب بل يتم تحديدها بشكل صريح. لإصلاح المشكلة، يمكنك استخدام أحد الأساليب التالية:
struct Foo { شريط فارغ (أ) {} شريط فارغ (ب) {} };
struct Foo
{
void bar(A) {}
void bar(B) {}
};
قالب
struct Foo
{
void bar(A) {}
void bar(B) {}
};
template struct Foo { void bar() {} }; القالب struct Foo { void bar() {} };
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3