كيفية تقديم تخصص صريح إلى طريقة واحدة فقط في فئة قالب C ++؟

StackOverflow https://stackoverflow.com/questions/1481677

سؤال

لدي فئة قالب تبدو مثل هذا:

template<class T> class C
{
    void A();
    void B();

    // Other stuff
};

template<class T> void C<T>::A() { /* something */ }
template<class T> void C<T>::B() { /* something */ }

ما أريده هو تقديم تخصص واضح فقط A مع الاحتفاظ الافتراضي ل B و "الأشياء الأخرى".

ما حاولت حتى الآن

class D { };
template<> void C<D>::A() { /*...*/ } // Gives a link error: multiple definition

كل متغير آخر حاولت فشل مع تحليل أخطاء.


ماذا فعلت:

كانت المشكلة الأصلية هي أن التخصص الصريح في ملف رأس، لذا فقد تم إلقاؤه في العديد من ملفات الكائنات وتوضيح الرابط (لماذا لا يلاحظ رابط كل مثيلات الرمز نفسها أكثر ما يصمت فقط؟)

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

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

المحلول

بدلا من ذلك إلى حل Martin York المضمن، يمكنك أيضا القيام به في ملف رأسك:

class D { };
template<> void C<D>::A(); // Don't implement here!

وتوفير ملف .cpp مع التنفيذ:

template<> void C<D>::A() { /* do code here */ }

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

نصائح أخرى

يحاول

template<> inline void c<int>::A() { ... }
//         ^^^^^^

كما حددت ذلك في ملف رأس. كل ملف مصدر يرى أنه سيبني إصدارا واضحا منه. هذا ينتج عنه أخطاء ربط الخاص بك. لذلك jsut تعلن أنه مضمن.

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