Giả sử tôi đã tuyên bố:"mẫu <>" so với "mẫu" không có dấu ngoặc - sự khác biệt là gì?
template <typename T> void foo(T& t);
Bây giờ, sự khác biệt giữa
template <> void foo<int>(int& t);
và
template void foo<int>(int& t);
ngữ nghĩa là gì? Và các khuôn mẫu với các dấu ngoặc đơn và các khuôn mẫu có các khung rỗng có các ngữ nghĩa khác trong các ngữ cảnh khác không?
để liên quan: How do I force a particular instance of a C++ template to instantiate?
Điều đó khá khó hiểu! Tôi giả định ý nghĩa của tuyên bố là trình biên dịch sẽ không chấp nhận sự khởi tạo của mẫu không chuyên biệt như một ứng cử viên, khi định nghĩa chuyên ngành không được tìm thấy? – einpoklum
Giải thích điều này thêm một chút: cái đầu tiên có thể được sử dụng trong một tệp tiêu đề và nó nói "' foo 'sẽ có một phần tử khác với' foo '"; nếu mã ở nơi khác trong chương trình gọi 'foo ()' nhưng bạn không cung cấp cho cơ thể thì bạn sẽ nhận được lỗi alink. –
Cách thứ hai không nên được sử dụng trong tệp tiêu đề; sử dụng nó trong một tệp .cpp đảm bảo rằng nội dung của 'foo' (sử dụng mẫu 'foo ' để tạo ra nó trừ khi bạn cũng có dòng chuyên môn!) thực sự được xử lý (Nó giống như * định nghĩa * a non -template chức năng). Thông thường bạn không cần phải làm điều này vì nó xảy ra bất cứ khi nào một số mã khác gọi 'foo ', nhưng bạn có thể muốn làm điều đó [vì một vài lý do] (http://stackoverflow.com/questions/2351148/explicit- instantiation-when-is-it-used) –