Por qué las plantillas de C++ deben definirse en el archivo de encabezado y no en .cpp
¡Hola a todos! Empecé a estudiar C++ y me encontré con un problema que me confunde mucho. Intento dividir el código en archivos de encabezado (.h) y archivos de implementación (.cpp), como me enseñaron para clases y funciones normales. Pero cuando uso templates, esto deja de funcionar.
Aquí hay un ejemplo simple. Tengo un archivo de encabezado `math_utils.h`:
```cpp
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
template
T max(T a, T b);
#endif
```
Y un archivo de implementación `math_utils.cpp`:
```cpp
#include "math_utils.h"
template
T max(T a, T b) {
return (a > b) ? a : b;
}
```
Y `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;
}
```
Al compilar, obtengo un error del linker (undefined reference). ¿Por qué sucede esto? Con funciones normales este enfoque funciona perfectamente. He leído que las plantillas deben definirse directamente en el