سؤال

هل من الممكن استخدام إعلان "استخدام" مع فئات قاعدة القالب؟ لقد قرأته ليس كذلك هنا ولكن هل هذا بسبب سبب فني أم أنه مقابل معيار C ++ ، وهل ينطبق على مجلس التعاون الخليجي أو المجمعين الآخرين؟ إذا لم يكن ذلك ممكنًا ، فلماذا لا؟

رمز المثال (من الرابط أعلاه):

struct A {
    template<class T> void f(T);
};

struct B : A {
    using A::f<int>;
};
هل كانت مفيدة؟

المحلول

ما ربطته هو توجيه باستخدام. يمكن استخدام إعلان باستخدام فئات قاعدة templated (لم يبحث عن ذلك في المعيار ، ولكن فقط اختبره مع برنامج التحويل البرمجي):

template<typename T> struct c1 { 
    void foo() { std::cout << "empty" << std::endl; } 
}; 

template<typename T> struct c2 : c1<T> { 
    using c1<T>::foo; 
    void foo(int) { std::cout << "int" << std::endl; } 
}; 

int main() { 
    c2<void> c;
    c.foo();
    c.foo(10); 
}

يجد المترجم بشكل صحيح المعلمة أقل foo وظيفة بسبب استخدامنا لإعادة تراجعه في نطاق c2, ، ويخرج النتيجة المتوقعة.

يحرر: تحديث السؤال. هنا الجواب المحدث:

المقالة صحيحة في أنه لا يُسمح لك باستخدام معرف قالب (اسم القالب والوسائط). ولكن يمكنك وضع اسم قالب:

struct c1 { 
    template<int> void foo() { std::cout << "empty" << std::endl; } 
}; 

struct c2 : c1 { 
    using c1::foo; // using c1::foo<10> is not valid
    void foo(int) { std::cout << "int" << std::endl; } 
}; 

int main() { 
    c2 c;
    c.foo<10>();
    c.foo(10); 
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top