Tôi vừa mới chạy vào một tình huống trong khi chuyên các mẫu mà đã làm cho tôi khó chịu:làm tất cả các trình biên dịch bỏ qua mã mẫu đã tạo khi các chuyên môn rõ ràng có sẵn cho trình liên kết không?
foo.h:
template <class T>
void foo() {
std::cout << "This is the generic foo" << std::endl;
}
foo.cc:
#include "foo.h"
template <>
void foo<int>() {
std::cout << "This is foo<int>" << std::endl;
}
main.cc:
#include "foo.h"
int main() {
foo<int>();
}
So. Tôi biên dịch như sau:
g++ -c main.cc
g++ -c foo.cc
g++ -o main main.o foo.o
Đầu ra là "This is foo<int>"
. Tôi thích đầu ra này. Nhưng tôi lo lắng rằng những gì tôi đang quan sát có thể là duy nhất đối với gcc (tôi không có quyền truy cập vào các trình biên dịch khác để tôi không thể kiểm tra).
Đây là những gì tôi nghĩ rằng gcc đang làm: Khi main.cc được biên dịch, tôi hy vọng nó sẽ phát ra mã chung cho cuộc gọi foo vì nó không biết về chuyên môn trong foo.cc. Nhưng bằng cách liên kết với foo.o, nó sử dụng chuyên môn thay vì nó có cùng chữ ký.
Nhưng điều này có tệ không? Tôi lo lắng rằng các trình biên dịch khác (hoặc thậm chí là các phiên bản khác nhau của gcc?) Có thể mang chữ ký của chúng khi chúng phát ra mã mẫu, theo cách liên kết với foo.o sẽ không thay thế hành động chung như tôi muốn. Đây có phải là một lo lắng hợp lệ? Tôi đã đọc rất nhiều điều khiến tôi cảm thấy khó chịu, nhưng không có gì khiến tôi cảm thấy tự tin về những gì đang xảy ra trong tình hình hiện tại của mình.
Có, bạn không thể dựa vào điều này. Cách di động là chuyển chuyên môn sang tệp .h. –
@HansPassant: bạn không cần phải di chuyển nó, nhưng nó cần phải được biết đến với trình biên dịch (tức là tuyên bố) –