11

Tôi không thể thấy tại sao câu lệnh trong chính là mơ hồ.Sự mơ hồ về chuyên môn một phần của mẫu

template<class T, class U, int I> struct X 
{ void f() { cout << "Primary template" << endl; } }; 


template<class T, int I> struct X<T, T*, I> 
{void f() { cout << "Partial specialization 1" << endl;}}; 

template<class T, class U, int I> struct X<T*, U, I> 
{void f() { cout << "Partial specialization 2" << endl;}}; 

template<class T> struct X<int, T*, 10> 
{void f() { cout << "Partial specialization 3" << endl;}}; 

template<class T, class U, int I> struct X<T, U*, I> 
{void f() { cout << "Partial specialization 4" << endl;}}; 

int main() 
{ 
    X<int, int*, 10> f; 
} 

Không phải là X<int, T*, 10> mẫu chuyên biệt nhất? Đây là ví dụ từ http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fpartial_specialization.htm

+1

Lý do được đưa ra bên dưới ví dụ: Trình biên dịch sẽ không cho phép khai báo 'X ' f vì nó có thể khớp với cấu trúc mẫu 'X ', mẫu struct 'X ' hoặc mẫu struct 'X ' và không có tuyên bố nào trong số các khai báo này phù hợp hơn so với các khai báo khác. –

Trả lời

10

Chuyên môn mẫu chuyên môn hơn so với danh sách đối số khác khớp với danh sách đầu tiên khớp với dấu hai, nhưng không phải theo cách khác.

Khi nhìn vào X<int, T*, 10>X<T, T*, I>:

  • X<int, float*, 10> phù hợp với người đầu tiên nhưng không phải là thứ hai.
  • X<float, float*, 10> khớp với số thứ hai nhưng không khớp với giá trị thứ hai.

Do đó không chuyên biệt hơn loại kia và bản mẫu hóa khớp với cả hai chuyên môn sẽ không biên dịch.

+0

Cũng đề cập đến việc đặt hàng một phần các chuyên môn của mẫu lớp, do đó phụ thuộc vào thứ tự một phần của các mẫu chức năng * đã bị quá tải * bao gồm các tham số mẫu của các chuyên môn mẫu lớp. – Nawaz

+1

@Nawaz: Tôi biết đó là cách họ giải thích nó trong tiêu chuẩn, nhưng tôi nghĩ tôi nghĩ nó sẽ vượt quá mọi thứ vì lợi ích nhỏ để giải thích tất cả ở đây (tôi cũng cần giải thích các quy tắc cho mẫu hàm đặt hàng từ 14.5. 5.2, và khấu trừ đối số mẫu từ 14.8.2). Vui lòng thêm câu trả lời nếu bạn nghĩ rằng điều này cần thêm chi tiết. – interjay

+0

Cảm ơn, bây giờ tôi đã hiểu. Tôi đã đọc phần giải thích ở phần cuối, nhưng tôi không thể hiểu tại sao 'X ' không phải là giải pháp chuyên biệt nhất. – user1116459

Các vấn đề liên quan