"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا تفشل Microsoft Visual C ++ في تنفيذ إنشاء مثيل للقالب ثنائي المراحل بشكل صحيح؟

لماذا تفشل Microsoft Visual C ++ في تنفيذ إنشاء مثيل للقالب ثنائي المراحل بشكل صحيح؟

نشر في 2025-03-09
تصفح:662

] ما هي الجوانب المحددة للآلية تفشل في العمل كما هو متوقع؟ ومع ذلك ، تنشأ الشكوك فيما يتعلق بما إذا كان هذا الشيك يتحقق مما إذا كان يتم الإعلان عن الأسماء المستخدمة في القوالب بشكل مناسب. فشل في التحقق من وجود أسماء معلنة ، مما يؤدي إلى مشكلات التجميع عندما تفتقر الأسماء إلى الإعلانات المناسبة.

Why Does Microsoft Visual C   Fail to Correctly Implement Two-Phase Template Instantiation?
لتوضيح ذلك ، فكر في المثال التالي:

قالب struct s { s () {int i = foo (0) ؛ } } ؛ void foo (int) ؛ int main () { s s ؛ }

من شأن المترجم المتوافق مع المعيار حل استدعاء FOO (0) أثناء المرحلة الأولى وربطه بـ foo (void*). ومع ذلك ، فإن MSVC تؤجل هذه العملية إلى المرحلة الثانية ، وربط FOO (0) بشكل غير صحيح بـ FOO (int) وينتج عن خطأ. علاوة على ذلك ، فإن تنفيذ MSVC للمرحلة الثانية ينبع المرحلة. هيكل s {} ؛ } شريط void (void *) {} قالب & lt ؛ typename t & gt ؛ void foo (t *t) { شريط (t) ؛ } شريط void (n :: s *s) {} int main () { n :: s ؛ foo (& amp ؛ s) ؛ }

في كلتا الحالتين ، يخالف سلوك MSVC الفصل المحدد بين المرحلتين الأولى والثانية من إنشاء إنشاء القالب. يستمر هذا التنفيذ غير الصحيح في Visual Studio 2015.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3