Instanciação e uso de modelo de arquivo de origem cruzada
-
26-09-2019 - |
Pergunta
Eu tenho uma classe com várias funções de membro de modelo que gostaria de distribuir entre vários arquivos de origem para acelerar o tempo de compilação.(Os modelos são detalhes de implementação e não se destinam a serem usados fora da classe, daí sua definição em fontes e não em cabeçalhos.)
Como eu dividiria esses modelos de forma que não recebesse erros do vinculador?Se eu tiver o arquivo de origem A usando um modelo definido no arquivo de origem B, como posso garantir que a instância apropriada do modelo seja construída pelo compilador?
Solução
Eu não poderia responder melhor do que o FAQ do C++:
https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl
Outras dicas
Simplesmente não declare esses itens de modelo como parte da classe no arquivo de cabeçalho.Em seguida, defina seus modelos apenas no arquivo de origem.Por exemplo:
MinhaClasse.hpp
class MyClass
{
public:
void SomePublicMethod() const;
};
MinhaClasse.cpp
template<class T>
void SomethingWithT(T myVal)
{
// ...
}
void MyClass::SomePublicMethod() const
{
SomethingWithT(42);
}