Vấn đề bạn có ở đây là bạn đã ẩn định nghĩa của hàm tạo trong tệp .cpp. Định nghĩa này áp dụng cho tất cả các loại T
, bao gồm T
dưới dạng int
mà bạn sử dụng, nhưng thực sự không cung cấp bất kỳ định nghĩa nào vì nó vẫn chỉ là tuyên bố.
Trình liên kết không thể tìm thấy biểu tượng Array<int>::Array()
.
Bây giờ, bạn có thể thêm một dòng như thế này:
Array<int> arr1;
đến cuối tập tin Array.cpp bạn và điều này làm cho trình biên dịch thuyết minh định nghĩa chính xác mà các mối liên kết được tìm kiếm. Tuy nhiên, điều này chỉ cung cấp một định nghĩa, nghĩa là Array<int>
và không khác.
Giải pháp này sẽ làm việc, cho đến khi bạn cần một Array
của một tham số mẫu khác nhau, nói, double
, lúc này bạn sẽ cần phải thêm:
Array<double> arr2;
đến cuối tập tin Array.cpp của bạn - bây giờ bạn có thể thấy điều này là không bền vững!
Nếu bạn cần C++ để làm việc với loại loại mà bạn có thể muốn trong tương lai, bây giờ là lúc di chuyển định nghĩa của ctor (và có lẽ tất cả các hàm thành viên khác) vào đầu trang (và xóa tệp .cpp vì nó sẽ không còn bất kỳ thứ gì trong đó).
Sẽ hữu ích khi liên kết câu hỏi này với https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file nhưng không thực sự trùng lặp. OP không biết điều gì đó hoàn toàn được giả định trong câu hỏi đó. – Winter