พิจารณาโอเวอร์โหลด 2 ตัวต่อไปนี้
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
อันที่หนึ่งใช้ได้กับคลาสปกติขณะที่อันที่สองใช้ได้กับเทมเพลตที่ไม่ได้สร้างอินสแตนซ์ ตัวอย่างเช่น
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
ตอนนี้ให้พิจารณาฟังก์ชั่นเทมเพลตต่อไปนี้:
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
ใน GCC จะให้ข้อผิดพลาดสำหรับการแก้ปัญหาการโอเวอร์โหลดที่คลุมเครือในขณะที่ Clang คอมไพล์ น่าสนใจการเรียกเพื่อทดสอบครั้งที่สอง () ไม่ก่อให้เกิดข้อผิดพลาด (แม้แต่ใน GCC) นอกจากนี้หากฉันลบtemplate<typename U>
สิ่งที่อยู่ด้านบนของ templfun, gcc หยุดบ่น
นี่เป็นข้อบกพร่องของ GCC หรือเป็นรหัสที่ผิดกฎหมายหรือไม่?