รูปที่ 1: เทมเพลตฟังก์ชัน
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;
}
นี่เป็นวิธีใช้ที่ถูกต้องextern template
หรือฉันใช้คีย์เวิร์ดนี้เฉพาะกับเทมเพลตคลาสดังรูปที่ 2
รูปที่ 2: เทมเพลตคลาส
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;
}
ฉันรู้ว่าเป็นการดีที่จะใส่สิ่งเหล่านี้ทั้งหมดไว้ในไฟล์ส่วนหัวเดียว แต่ถ้าเราสร้างอินสแตนซ์เทมเพลตด้วยพารามิเตอร์เดียวกันในหลายไฟล์เราจะมีคำจำกัดความเดียวกันหลายคำและคอมไพเลอร์จะลบทั้งหมด (ยกเว้นหนึ่งรายการ) เพื่อหลีกเลี่ยงข้อผิดพลาด ฉันจะใช้extern template
อย่างไร? เราใช้กับคลาสเท่านั้นได้ไหมหรือใช้กับฟังก์ชันได้ด้วย?
นอกจากนี้รูปที่ 1 และรูปที่ 2 อาจขยายเป็นโซลูชันที่เทมเพลตอยู่ในไฟล์ส่วนหัวเดียว ในกรณีนี้เราจำเป็นต้องใช้extern template
คีย์เวิร์ดเพื่อหลีกเลี่ยงการสร้างอินสแตนซ์เดียวกันหลายครั้ง นี่เฉพาะคลาสหรือฟังก์ชันด้วยหรือเปล่า?
extern template class foo<int>();
ดูเหมือนความผิดพลาด
()
กับสายภายนอก ทั้งหนังสือและสตูดิโอภาพของคุณผิดลองใช้คอมไพเลอร์ที่สอดคล้องกับมาตรฐานมากขึ้นเช่น g ++ หรือเสียงดังแล้วคุณจะพบปัญหา