Por que os templates C++ precisam ser implementados em arquivos de cabeçalho? Erro undefined reference
Olá! Sou novo em C++ e estou tentando entender os templates. Tenho um projeto simples com três arquivos: `main.cpp`, `math_utils.h` e `math_utils.cpp`.
No arquivo de cabeçalho, declarei uma função template:
```cpp
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
template
T max(T a, T b);
#endif
```
No arquivo de implementação, escrevi:
```cpp
// math_utils.cpp
#include "math_utils.h"
template
T max(T a, T b) {
return (a > b) ? a : b;
}
```
E no `main.cpp` eu uso:
```cpp
// main.cpp
#include
#include "math_utils.h"
int main() {
std::cout << max(5, 10) << std::endl;
return 0;
}
```
Ao compilar, recebo um erro de linker: `undefined reference to 'int max(int, int)'`. Li que os templates precisam ser implementados em arquivos de cabeçalho, mas por quê? Já que com funções normais não há esse problema — posso declarar no `.h`, implementar no `.cpp`, e tudo funciona. Por que com templates não é assim? Existe alguma