Avatar ·

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.