Şekil 1: işlev şablonları
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;
}
Kullanmanın doğru yolu bu mu extern template
yoksa bu anahtar kelimeyi yalnızca Şekil 2'deki gibi sınıf şablonları için mi kullanıyorum?
Şekil 2: sınıf şablonları
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;
}
Bunların hepsini tek bir başlık dosyasına koymanın iyi olduğunu biliyorum, ancak birden fazla dosyada aynı parametrelere sahip şablonları başlatırsak, birden fazla aynı tanım elde ederiz ve derleyici hataları önlemek için hepsini (biri hariç) kaldıracaktır. Nasıl kullanırım extern template
? Onu sadece sınıflar için kullanabilir miyiz, yoksa fonksiyonlar için de kullanabilir miyiz?
Ayrıca, Şekil 1 ve Şekil 2, şablonların tek bir başlık dosyasında olduğu bir çözüme genişletilebilir. Bu durumda, extern template
birden fazla aynı anlıktan kaçınmak için anahtar kelimeyi kullanmamız gerekir . Bu sadece sınıflar veya işlevler için mi?
extern template class foo<int>();
bir hata gibi görünüyor.
()
harici satırın yakınında 'beklenen niteliksiz-id' yazmasını düzeltsem bile . hem kitabınız hem de görsel stüdyonuz yanlış, g ++ veya clang gibi daha standart uyumlu derleyici kullanmayı deneyin ve sorunu göreceksiniz.