Gambar 1: template fungsi
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;
}
Apakah ini cara yang benar untuk digunakan extern template
, atau apakah saya menggunakan kata kunci ini hanya untuk templat kelas seperti pada Gambar 2?
Gambar 2: template kelas
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;
}
Saya tahu itu baik untuk meletakkan semua ini dalam satu file header, tetapi jika kita membuat contoh template dengan parameter yang sama di beberapa file, maka kita mendapat beberapa definisi yang sama dan kompiler akan menghapus semuanya (kecuali satu) untuk menghindari kesalahan. Bagaimana cara saya menggunakan extern template
? Bisakah kita menggunakannya hanya untuk kelas, atau dapatkah kita menggunakannya untuk fungsi juga?
Selain itu, Gambar 1 dan Gambar 2 dapat diperluas menjadi solusi di mana templat berada dalam satu file header. Dalam hal ini, kita perlu menggunakan extern template
kata kunci untuk menghindari beberapa instan yang sama. Apakah ini hanya untuk kelas atau fungsi juga?
extern template class foo<int>();
sepertinya ada kesalahan.
()
baris eksternal. baik buku dan studio visual Anda salah, coba gunakan kompiler yang lebih memenuhi standar seperti g ++ atau clang dan Anda akan melihat masalahnya.