Avatar ·

لماذا يجب تعريف قوالب C++ في ملف الرأس وليس في .cpp؟

مرحباً بالجميع! بدأت تعلم C++ وواجهت مشكلة تحيرني كثيراً. أحاول تقسيم الكود إلى ملفات رأس (.h) وملفات تنفيذ (.cpp)، كما تعلمت للفئات والدوال العادية. لكن عندما أستخدم القوالب (templates)، يتوقف هذا عن العمل. إليك مثال بسيط. لدي ملف رأس `math_utils.h`: ```cpp #ifndef MATH_UTILS_H #define MATH_UTILS_H template T max(T a, T b); #endif ``` وملف تنفيذ `math_utils.cpp`: ```cpp #include "math_utils.h" template T max(T a, T b) { return (a > b) ? a : b; } ``` و `main.cpp`: ```cpp #include #include "math_utils.h" int main() { std::cout << max(3, 7) << std::endl; std::cout << max(3.5, 2.1) << std::endl; return 0; } ``` عند الترجمة، أحصل على خطأ linker (undefined reference). لماذا يحدث هذا؟ بينما مع الدوال العادية يعمل هذا الأسلوب بشكل ممتاز. قرأت أن القوالب يجب تعريفها مباشرة في الـ