لماذا يجب تنفيذ القوالب (templates) في C++ في ملفات الرأس (header files)؟ خطأ undefined reference
مرحبًا! أنا مبتدئ في C++ وأحاول فهم القوالب (templates). لدي مشروع بسيط من ثلاثة ملفات: `main.cpp` و `math_utils.h` و `math_utils.cpp`.
في ملف الرأس (header file)، أعلنت عن دالة قالبية (template function):
```cpp
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
template
T max(T a, T b);
#endif
```
في ملف التنفيذ (implementation file)، كتبت:
```cpp
// math_utils.cpp
#include "math_utils.h"
template
T max(T a, T b) {
return (a > b) ? a : b;
}
```
وفي `main.cpp` أستخدم:
```cpp
// main.cpp
#include
#include "math_utils.h"
int main() {
std::cout << max(5, 10) << std::endl;
return 0;
}
```
عند التجميع، أحصل على خطأ ربط (linking error): `undefined reference to 'int max(int, int)'`. قرأت أن القوالب (templates) يجب تنفيذها في ملفات الرأس (header files)، لكن لماذا؟ فالدوال العادية لا تواجه هذه المشكلة — يمكنني الإعلان في `.h` والتنفيذ في `.cpp`، وكل شيء يعمل. لماذا الأمر ليس كذلك مع القوالب (templates)؟ هل هناك