لماذا لا يمكن أن يأخذ ناقل STD :: نوعًا محليًا؟
-
20-09-2019 - |
سؤال
void foo() {
struct Foo { .. };
std::vector<Foo> vec; // why is this illegal?
}
أنا لا أعيد فو إلى العالم الخارجي. إنه مجرد نوع مؤقت أستخدمه في الوظيفة.
المحلول
لا يمكن أن يكون الفصل المحلي حجة قالب. لأن المعيار يقول:-
14.3.1 الفقرة 2: "لا يجوز استخدام نوع محلي ، أو نوع بدون ربط ، أو نوع لم يكشف عن اسمه أو نوع مركب من أي من هذه الأنواع كوسيطة قالب لمعلمة نوع القالب."
[Example:
template <class T> class X { /* ... */ };
void f()
{
struct S { /* ... */ };
X<S> x3; // error: local type used as templateargument
X<S*> x4; // error: pointer to local type used as templateargument
}
-end example] [Note: a template type argument may be an incomplete
type (3.9). ]"
يقترح حل واحد هنا على CLC ++. المعتدل.
تحديث: كان هناك بعض النقاش حول لماذا لا يمكن أن يكون لديك فئات محلية كحجال قالب؟ الروابط هنا و هنا على c.std.c ++ ناقش نفس الشيء.
نصائح أخرى
اجابة قصيرة:لأن معيار C ++ يقول ذلك (القسم 14.3.1
)
اجابة طويلة:في الوقت الذي تم فيه توحيد C ++ ، اعتقدت لجنة معايير C ++ أن هناك مشكلات في التنفيذ والأداء. تبين أن تلك المخاوف لا أساس لها من الصحة ، وفي المسودة النهائية لمعيار C ++ 0x ، فقد عكسوا القرار.
في ملاحظة أكثر عملية ، يدعم بعض المجمعين بالفعل قواعد C ++ 0x الجديدة:
- بالنسبة لـ MacOSX ، ستحتاج إلى GCC> = 4.5 مع
-std=c++0x
معلمة سطر الأوامر - بالنسبة لمجمول البرمجيات Microsoft ستحتاج> = VC8/VS2005 بدون ال
/Za
الخيار (تعطيل ملحقات اللغة)