Hình 1: các mẫu hàm
TemplHead.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;
}
Đây có phải là cách sử dụng đúng extern template
hay tôi chỉ sử dụng từ khóa này cho các mẫu lớp như trong Hình 2?
Hình 2: các mẫu lớp
TemplHead.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;
}
Tôi biết sẽ tốt khi đặt tất cả những thứ này vào một tệp tiêu đề, nhưng nếu chúng tôi khởi tạo các mẫu có cùng tham số trong nhiều tệp, thì chúng tôi có nhiều định nghĩa giống nhau và trình biên dịch sẽ xóa tất cả (trừ một) để tránh lỗi. Làm thế nào để tôi sử dụng extern template
? Chúng ta có thể sử dụng nó chỉ cho các lớp, hoặc chúng ta cũng có thể sử dụng nó cho các chức năng?
Ngoài ra, Hình 1 và Hình 2 có thể được mở rộng thành một giải pháp trong đó các mẫu nằm trong một tệp tiêu đề duy nhất. Trong trường hợp đó, chúng ta cần sử dụng extern template
từ khóa để tránh nhiều lần xuất hiện giống nhau. Đây có phải chỉ dành cho các lớp hoặc chức năng quá?
extern template class foo<int>();
có vẻ như một sai lầm.
()
dòng bên ngoài. cả sách và studio trực quan của bạn đều sai, hãy thử sử dụng trình biên dịch tuân thủ tiêu chuẩn hơn như g ++ hoặc clang và bạn sẽ thấy vấn đề.