C++ / دليل حلول تحريري
إصلاح المراجع غير المعرّفة وتعريفات القوالب المفقودة
افصل فشل الرابط عن رفض المترجم، ثم تحقق من ترجمة التعريف المطابق وإتاحته عند الحاجة وإدراجه في الهدف.
قاعدة معرفة للقراءة فقط · بلا تعليقات عامة
تعرّف على الأعراض
يُترجم ملف المصدر لكن البناء النهائي يبلغ عن undefined reference أو unresolved external symbol. تختلف الصياغة بين الأدوات. كفى التصريح لترجمة الاستدعاء، لكن الرابط لا يجد التعريف المطلوب. لم يُنتج ملف تنفيذي جديد ذو نتيجة مضمونة.
قد ينجح نوع وسيط للقالب ويفشل آخر، خاصة حين يوضع التعريف في ملف تنفيذ منفصل فقط. اعتبر التخصيص المذكور في التشخيص دليلًا، ولا تفترض سببًا واحدًا لكل فشل ربط للقوالب.
افهم الأسباب المحتملة
- قد يغيب تعريف دالة عادية عن الهدف أو يختلف توقيعه أو نطاق أسمائه أو يوجد في مكتبة لا يربطها الهدف. لا يثبت نجاح الترجمة ربط ملف التنفيذ. يساعد البناء النظيف على فصل عيب الاعتماد الحقيقي عن الآثار القديمة.
- يلزم عمومًا ظهور تعريف القالب حيث يُنشأ التخصيص المطلوب. لا تنتج ترويسة التصريح وحدها تخصيصات اعتباطية من تعريف مخفي بوحدة أخرى. والإنشاء الصريح بديل لمجموعة أنواع مدعومة ومنسقة عن قصد فقط.
تحديد الكيان المطلوب بدقة
اقرأ أول تشخيص ربط وقارن الاسم والأنواع والثبات ونطاق الأسماء بالتعريف. افحص مصادر الهدف وأمر الربط الفعليين. لا تضف مكتبات غير مرتبطة قبل فهم الكيان المفقود. لا يوفّر هذا التصريح تنفيذًا عمدًا؛ فهو مقطع اعتماد وليس برنامجًا تنفيذيًا كاملًا.
template<class T>
T twice(T value);
يُقبل هذا كتصريح لكنه لا يوفّر كل تخصيص بنفسه. ليس برنامجًا مستقلًا قابلًا للتشغيل.
إظهار التعريف أو الإنشاء المقصود
لواجهة قوالب مفتوحة ضع التعريف في الترويسة مع حمايتها من التضمين المتكرر. يوضح برنامج التحقق الأحادي الملف القاعدة نفسها بوضع التعريف قبل استعماله. في المشروع ضمّن الترويسة المعرّفة لدى كل مستدعٍ. وإذا اخترت الإنشاء الصريح فطابق تصريحاته وتعريفاته واربط ملف التنفيذ.
#include <iostream>
template<class T>
T twice(T value) { return value + value; }
int main() {
std::cout << twice(6) << "\n";
}
12
يمكن إنشاء تخصيص int لأن تعريفه ظاهر. جمع ستة وستة قابل للتمثيل ويطبع اثني عشر.
إصلاح إعداد الهدف
للدوال العادية أضف المصدر أو المكتبة إلى الهدف بدل تضمين ملفات التنفيذ كحل التفافي. افحص التوافق الثنائي ووضع البناء للمكتبات المسبقة. خطأ التعريف المكرر بعد الإصلاح مشكلة مختلفة؛ فقد عُرّفت دالة عادية غير inline في وحدات متعددة. لا تصلح حواجز التضمين وحدها هذا التعارض بين الوحدات.
تحقق من نجاح الإصلاح
أعد البناء من مجلد جديد بالمعيار والاعتمادات الموثقة نفسها. أكد حل الرمز المفقود وشغّل الملف المقصود لا أثرًا سابقًا. ينبغي أن يطبع برنامج التحقق 12 ثم سطرًا جديدًا في C++20.
لقالب ترويسة ترجم وحدة مستدعٍ ثانية تستخدم كل نوع معلن دعمه. يكشف ذلك الاعتماد العرضي على تصريحات أو تخصيصات لا توجد إلا في المصدر الأصلي. يجيب الربط والتنفيذ عن سؤالين مختلفين ويلزم كلاهما للتحقق.
امنع تكرار المشكلة
- أظهر اعتمادات الهدف وضمّن ترويسات تعريف القوالب مباشرة واحفظ أمر البناء كاملًا مع تقرير العيب. افصل التخصيصات الصريحة المدعومة عن واجهة تعد بأنواع متوافقة عامة.