2015-02-05 41 views
62

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); 

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?

Trả lời

55

template <> void foo<int>(int& t); tuyên bố một chuyên của mẫu, với cơ thể có khả năng khác nhau.

template void foo<int>(int& t); gây ra instantiation instant của mẫu, nhưng không giới thiệu chuyên môn. Nó chỉ ép buộc sự khởi tạo của mẫu cho một kiểu cụ thể.

+2

Đ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

+2

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. –

+3

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) –

12

Với lớp/struct,

template <typename T> struct foo {}; 

Sau đây là chuyên môn hóa:

template <> struct foo<int>{}; 

Sau đây là một rõ ràng trong stantiation:

template struct foo<int>; 
Các vấn đề liên quan