Pertimbangkan 2 kelebihan berikut ini
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
Yang pertama berfungsi untuk kelas reguler, sedangkan yang kedua berfungsi untuk templat yang tidak dipakai. Contohnya:
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
Sekarang pertimbangkan fungsi templat berikut:
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
Dalam GCC itu memberikan kesalahan untuk resolusi kelebihan ambigu, sementara Dentang mengkompilasi. Menariknya, panggilan kedua untuk menguji () tidak menghasilkan kesalahan (bahkan dalam GCC). Apalagi, jika saya menghapus template<typename U>
benda di atas templfun, gcc berhenti mengeluh.
Apakah ini bug dengan GCC atau itu kode ilegal?