لماذا لا يمكن أن يأخذ ناقل STD :: نوعًا محليًا؟

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

  •  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 الخيار (تعطيل ملحقات اللغة)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top