Hãy tưởng tượng bạn có một tập tin ahg ++, đòi hỏi mối liên kết cảnh báo/lỗi cho nhiều mẫu chuyên môn
#include <iostream>
template<typename T> struct A{
int magic;
A():magic(1234){}
void f(){std::cout<<"default f"<<magic<<std::endl;}
};
void f(A<int>* a);
thì hàm f được định nghĩa trong "a.cpp"
#include "a.h"
void f(A<int>* a){
a->f();
}
và cuối cùng, " main.cpp "chuyên về mẫu và sau đó sử dụng f
#include "a.h"
template<> struct A<int>{
};
int main(){
A<int> a;
f(&a);
}
Rõ ràng trình biên dịch sử dụng phiên bản không dành riêng cho ao và phiên bản chuyên biệt cho main.o, tức là có hai sự triển khai khác nhau của A. Khi thực hiện, f chỉ có thể in rác/segfault, bởi vì đối tượng được truyền có cấu trúc khác với cấu trúc mong đợi.
Có cách nào để làm cho trình liên kết cảnh báo rằng có hai phiên bản A không?
Đó là một vấn đề khá khó giải quyết, đó là lý do tại sao không có chẩn đoán bắt buộc cho việc này. – Flexo
HTH: xóa tất cả các mẫu khỏi câu hỏi - và bạn sẽ có kết quả tương tự. Chỉ để lại khai báo chuyển tiếp trong a.h của struct A; và chuyển toàn bộ phiên bản sang a.cpp. main.cpp - chỉ loại bỏ mẫu ... – PiotrNycz