Đối với đoạn mã sau:gọi mơ hồ của mẫu quá tải với tham số (const T &, const T &) hoặc (const char (&) [N], const char (&) [M])
#include <iostream>
using std::cout; using std::endl;
template <typename T>
int compare(const T&, const T&) {
cout << __PRETTY_FUNCTION__ << endl;
return 0;
}
template <size_t N, size_t M>
int compare(const char (&)[N], const char (&)[M]) {
cout << __PRETTY_FUNCTION__ << endl;
return 0;
}
int main(int argc, char *argv[]) {
compare("hi", "is");
}
Khi tôi biên dịch mã với g++ -std=c++1y
, nó than phiền:
error: call of overloaded ‘compare(const char [3], const char [3])’ is ambiguous
compare("hi", "is");
Theo các quy tắc của mẫu quá tải, chức năng khả thi là:
compare(const T&, const T&) with T = char [3]
compare(const char (&)[N], const char (&)[M]) with N = 3ul, M = 3ul
Cả hai đều cung cấp một kết quả tương đương tốt (tức là chính xác) cho cuộc gọi. Vì vậy, tôi nên kiểm tra xem cái nào là chuyên biệt hơn.
Nhưng theo kiến thức hạn chế của tôi, const T&
tổng quát hơn const char (&)[N]
. Vì vậy, tôi nghĩ rằng compare(const char (&)[N], const char (&)[M])
là chuyên biệt hơn. Nhưng tại sao cuộc gọi này lại mơ hồ?
Tôi đồng ý về giải thích, nhưng giải pháp giới hạn việc sử dụng chuỗi 'so sánh' thứ hai với các chuỗi có kích thước bằng nhau. – xtofl
Cảm ơn bạn. Tôi có thể đã hiểu ý nghĩa của từ "chuyên ngành". Nhưng quy tắc chính xác của "chuyên ngành" trong C++ là gì? Tôi chưa đọc đặc tả của C++. Và tôi đang đọc cuốn sách C++ Primer. – zhenguoli
@xtofl Đó là một ví dụ cho cách khắc phục lỗi. Một ví dụ khác sẽ thay đổi quá tải đầu tiên để có hai loại khác nhau. Không biết các yêu cầu tôi không thể đưa ra một giải pháp thỏa mãn chúng. – interjay