Por que templates em C++ precisam ser definidos no arquivo de cabeçalho, e não no .cpp?
Olá a todos! Comecei a estudar C++ e me deparei com um problema que me deixa muito confuso. Estou tentando separar o código em arquivos de cabeçalho (.h) e arquivos de implementação (.cpp), como me ensinaram para classes e funções normais. Mas quando uso templates, isso para de funcionar.
Aqui está um exemplo simples. Tenho um arquivo de cabeçalho `math_utils.h`:
```cpp
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
template
T max(T a, T b);
#endif
```
E um arquivo de implementação `math_utils.cpp`:
```cpp
#include "math_utils.h"
template
T max(T a, T b) {
return (a > b) ? a : b;
}
```
E `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;
}
```
Ao compilar, recebo um erro do linker (undefined reference). Por que isso acontece? Já que com funções normais essa abordagem funciona perfeitamente. Li que templates precisam ser definidos diretamente no cabeçalho.