تعبير مستمر مع كائن مخصص
-
22-09-2019 - |
سؤال
أحاول استخدام لحظة من فئة مخصصة كمعلمة قالب.
class X {
public:
X() {};
};
template <class Foo, Foo foo>
struct Bar {
};
const X x;
Bar<X, x> foo;
ينص المترجم على ذلك x
لا يمكن أن تظهر في تعبير مستمر. لماذا ذلك؟ هناك كل ما يعطى لبناء هذا الكائن في وقت الترجمة.
المحلول
لا يمكنك فعل ذلك. المعيار 14.1 يقول:
4 يجب أن يكون المعلمة غير النوعية من النوع واحد من أنواع ما يلي (مؤهل اختياريًا للسيرة الذاتية):
- نوع متكامل أو تعداد ،
- مؤشر إلى كائن أو مؤشر للعمل ،
- الإشارة إلى كائن أو إشارة إلى الوظيفة ،
- مؤشر للعضو.
5 ملاحظة: يتم عدم السماح بأنواع أخرى إما أدناه أو ضمنيًا من خلال القواعد التي تحكم شكل القالب-الحجج(14.3). -ملاحظة] يتم تجاهل الماليفيات ذات المستوى الأعلى على المستوى على المعلمة القالب عند تحديد نوعه.
نصائح أخرى
كما أشار الآخرون ، لا يمكنك فعل ذلك. طالما أنك لا تلعب ألعاب برمجة الفوقية ، فإن الطريقة العادية لتمرير مثيل فعلي للفئة في المُنشئ:
template <class Foo>
struct Bar {
Bar( const Foo & f ) {
...
}
};
يمكن أن تكون معلمات القالب أنواعًا ، أو ثوابت متكاملة. X
هو نوع ، ولكن x
ليس. لا يمكنك أيضًا استخدام قيم نقطة عائمة ثابتة.