سؤال

أنا أقوم بنقل بعض التعليمات البرمجية المحببة من Windows وأضرب بعض الاختلافات في برنامج التحويل البرمجي على iPhone 3.2 SDK.

الكود الأصلي داخل وظيفة عضو قالب الفصل هو:

return BinarySearch<uint32, CSimpleKey<T> >(key);

حيث BinarySearch هي طريقة ورثت من قالب آخر.

هذا ينتج الخطأ التالي:

csimplekeytable.h:131: error: no matching function for call to 'BinarySearch(NEngine::uint32&)'

يبدو أن برنامج التحويل البرمجي Visual Studio يسير على غرامة التسلسل الهرمي للقالب ، لكن GCC تحتاجني إلى التأهل تمامًا من أين تأتي الوظيفة (لقد تحقق من ذلك من خلال إصلاح نفس المشكلات مع متغيرات أعضاء القالب بهذه الطريقة).

لذلك أنا الآن بحاجة إلى تغيير هذا إلى:

return CSimpleTable<CSimpleKey<T> >::BinarySearch<uint32, CSimpleKey<T> >(key);

الذي ينتج الآن الخطأ التالي:

csimplekeytable.h:132: error: expected primary-expression before ',' token
csimplekeytable.h:132: error: expected primary-expression before '>' token

بعد بعض الخدش في الرأس ، أعتقد أن ما يجري هنا هو أنه يحاول حل "<" قبل BinarySearch كمشغل "أقل من" لسبب ما.

لذلك سؤالان: - هل أنا على الطريق الصحيح مع تفسيري للخطأ؟ - كيف أصلحه؟

هل كانت مفيدة؟

المحلول

إذا CSimpleTable هو الفصل الأساسي ، تحتاج إلى تأهيل مكالمتك مع اسم الفئة الأساسية هذا أو بدلاً من ذلك this. ولكن نظرًا لأن كلاهما يعتمدان على معلمات القالب ، لا يمكن للمترجم البحث عن الاسم BinarySearch يعني. يمكن أن يكون ثابتًا ثابتًا ثابتًا ، والذي تقارنه مقابل شيء آخر ، أو قد يكون قالبًا تضعه في الحجج محاطة بها <...> إلى عن على. تحتاج إلى إخبار المترجم عن الأخير

/* the "::template" means: 'the name that follows is a template' */
return CSimpleTable<CSimpleKey<T> >::template BinarySearch<uint32, CSimpleKey<T> >(key);

أو مع this

return this->template BinarySearch<uint32, CSimpleKey<T> >(key);

سبب التأهيل هو أن المترجم لا يبحث عن أسماء غير مؤهلة في الفئات الأساسية التي تعتمد على معلمات القالب (في حالتك المعلمة T) ، نظرًا لأن ربط الاسم يعتمد على ما إذا كانت الفئة الأساسية لها مثل هذا الاسم أم لا ، وهو أمر مؤسف. للحصول على اسم عادي مثل BinarySearch, ، بالإضافة إلى ذلك ، لا يوجد أي مؤشر على أن هذا الاسم يعتمد على معلمة قالب ، وبالتالي يتطلب المعيار المجمعين عدم تأخير البحث عن الاسم حتى التثبيت. لذا ، فإن الاسم ، حتى إذا كان من الممكن العثور على البحث في القواعد التابعة عند إنشاء مثيل (وهو ليس) ، على أي حال.

يجب عليك أن تخبر المترجم بشكل صريح بالبحث في الفصل المرفق عن طريق تأهيله ، وفي هذه الحالة سيتضمن المترجم فصول قاعدة تابعة أثناء البحث عند إنشاء مثيل. البادئة مع this أو سيصنع اسم الفصل أيضًا الاسم يعتمد, ، وبالتالي تأخير البحث عنها حتى مثيل. هاتان الحقائقان مطلوبان لكي يعمل.

نصائح أخرى

ربما تكون مجرد مشكلة في uint32 typedef. قد يكون الأمر غير متوفر في البيئة الجديدة. في الحالة الأولى ، تلتقط دقة مساحة الاسم Nengine :: uint32 ، في الحالة الثانية ، لا يختار أي شيء على الإطلاق (وبالتالي خطأ التحليل).

أقترح البحث عن كيفية تعريف UINT32 على Windows ، ومحاولة نسخ هذا التعريف.

ربما يكون السبب في ذلك أنك جعلت مساراتك غير متناسقة. لقد فعلت CSimpleTable<CSimpleKey<T> >, ، عوضا عن CSimpleTable<CSimpleKey<T>>. أعتقد أنه ينبغي أن يكون كلاهما صالحًا ، لكن ربما يكون هناك خطأ محلل.

تحرير: يمكنك أيضًا محاولة التوجه إلى مسار خصم نوع الوسيطة التلقائي ، وتقطيع التخصص الصريح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top