Hãy xem xét 2 tình trạng quá tải sau đây
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
Cái thứ nhất hoạt động cho các lớp thông thường, trong khi cái thứ hai hoạt động cho các mẫu không được khởi tạo. Ví dụ:
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
Bây giờ hãy xem xét chức năng mẫu sau:
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
Trong GCC, nó cung cấp một lỗi cho độ phân giải quá tải mơ hồ, trong khi Clang biên dịch. Thật thú vị, cuộc gọi thứ hai để kiểm tra () không tạo ra lỗi (ngay cả trong GCC). Hơn nữa, nếu tôi loại bỏ template<typename U>
thứ trên đầu templfun, gcc sẽ ngừng phàn nàn.
Đây có phải là một lỗi với GCC hay nó là mã bất hợp pháp?