هل يمكن استخدام إعلان "استخدام" مع القوالب؟
سؤال
هل من الممكن استخدام إعلان "استخدام" مع فئات قاعدة القالب؟ لقد قرأته ليس كذلك هنا ولكن هل هذا بسبب سبب فني أم أنه مقابل معيار 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);
}
لا تنتمي إلى StackOverflow