2014-05-05 14 views
5
template<typename TA, typename TB> 
void foo (TA a, TB b); // #1 

template<typename T> 
void foo (T a, T b); // #2 

int a, b;  
foo(a, b); 

Trong trường hợp này, foo # 2 được gọi. Tại sao?Lựa chọn chức năng mẫu C++

+1

@ πάνταῥεῖ: Tôi không chắc điều đó liên quan đến câu hỏi này như thế nào. –

+0

@OliCharlesworth Tôi cũng vậy;) ... Hãy nghĩ rằng nhận xét của dyp phù hợp hơn với những gì tôi muốn thể hiện. –

+8

Trong trường hợp này, cả hai mẫu tạo ra một chữ ký hàm 'void foo (int, int)', vì vậy chúng được chọn dựa trên * một phần * thứ tự * cái nào là chuyên biệt hơn *. – dyp

Trả lời

1

Nếu bạn đã làm sáng tỏ những thông số mẫu, bạn sẽ sử dụng:

foo<int, int>(a, b); 

để gọi hàm đầu tiên.

Bạn sẽ sử dụng:

foo<int>(a, b); 

để gọi hàm thứ hai.

Vì bạn cho phép trình biên dịch chọn hàm, nó đã chọn hàm hạn chế hơn, đây là hàm thứ hai.

Tại sao chế độ hạn chế thứ hai lại hạn chế hơn? Trình biên dịch phải suy ra một loại để sử dụng hàm thứ hai. Nó phải suy ra hai loại để sử dụng cái đầu tiên.

+2

Tôi nghĩ rằng 'foo (a, b)' vẫn thực hiện độ phân giải quá tải và chỉ sử dụng hàm thứ hai vì hàm này chuyên biệt hơn. – dyp

+0

IMO thứ hai là * nhiều hơn * hạn chế, ergo * chuyên biệt hơn *: Nó loại trừ loại cho cả hai đối số riêng lẻ và nếu các loại suy luận không giống nhau, thì khấu trừ không thành công. – dyp

+0

@dyp Tôi nghĩ bạn đúng. Cảm ơn bạn đã chỉ ra lỗi. Đã cập nhật câu trả lời của tôi. –

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