Figura 1: modelos de função
TemplHeader.h
template<typename T>
void f();
TemplCpp.cpp
template<typename T>
void f(){
//...
}
//explicit instantation
template void f<T>();
Main.cpp
#include "TemplHeader.h"
extern template void f<T>(); //is this correct?
int main() {
f<char>();
return 0;
}
Esta é a maneira correta de usar extern template
ou devo usar essa palavra-chave apenas para modelos de classe, como na Figura 2?
Figura 2: modelos de classe
TemplHeader.h
template<typename T>
class foo {
T f();
};
TemplCpp.cpp
template<typename T>
void foo<T>::f() {
//...
}
//explicit instantation
template class foo<int>;
Main.cpp
#include "TemplHeader.h"
extern template class foo<int>();
int main() {
foo<int> test;
return 0;
}
Eu sei que é bom colocar tudo isso em um arquivo de cabeçalho, mas se instanciarmos modelos com os mesmos parâmetros em vários arquivos, teremos várias definições iguais e o compilador removerá todos (exceto um) para evitar erros. Como faço para usar extern template
? Podemos usá-lo apenas para classes ou podemos usá-lo para funções também?
Além disso, a Figura 1 e a Figura 2 podem ser expandidas para uma solução em que os modelos estão em um único arquivo de cabeçalho. Nesse caso, precisamos usar a extern template
palavra-chave para evitar várias instanciações iguais. Isso é apenas para classes ou funções também?
extern template class foo<int>();
parece um erro.
()
da linha externa. seu livro e estúdio visual estão errados, tente usar um compilador compatível com o padrão, como g ++ ou clang, e você verá o problema.