Mã sau đây biên dịch tốt bằng gcc và tiếng kêu.Tại sao những tình trạng quá tải này không rõ ràng?
template <typename T>
struct identity
{
typedef T type;
};
template <typename T>
void foo(typename identity<T>::type);
template <typename T>
void foo(T);
int main()
{
foo<int>(0);
}
Có vẻ như độ phân giải quá tải đang chọn quá tải đầu tiên (số identity<T>::type
một).
Ai đó có thể giải thích lý do tại sao tình trạng quá tải không rõ ràng? Theo như tôi có thể nói, khác biệt duy nhất giữa chúng là đối số của cái đầu tiên là ngữ cảnh không suy luận và đối số của cái thứ hai không phải là, nhưng vì tôi đang cung cấp đối số mẫu một cách rõ ràng, tôi không không thấy tại sao điều đó lại quan trọng.
Thú vị. Rõ ràng chức năng thứ hai sẽ được chọn nếu bạn đã kích hoạt loại khấu trừ bằng cách không rõ ràng instantiating 'foo (0)' nhưng 'foo (0)' thay thế (Không có loại khấu trừ cho chức năng meta danh tính)[email protected] Prowl: Tôi không muốn đặt câu hỏi cho câu trả lời của bạn để chỉ ra rằng lý luận của bạn không rõ ràng vì nó có thể xuất hiện. Cho tham số foo một giá trị mặc định và gọi 'foo ()' không có tham số. Lập luận của bạn vẫn nên áp dụng nhưng bây giờ sự quá tải thực sự mơ hồ như HighCommander4 mong đợi. Trình diễn mẫu nhanh của các mẫu chức năng phức tạp. –