Aşağıdaki aşırı yüklenmeleri göz önünde bulundurun
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
Birincisi normal sınıflar için, ikincisi ise örneklenmemiş şablonlar için çalışır. Örneğin:
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
Şimdi aşağıdaki şablon işlevini göz önünde bulundurun:
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
GCC'de belirsiz aşırı yük çözünürlüğü için bir hata verirken Clang derler. İlginçtir, ikinci test () çağrısı hata üretmez (GCC'de bile). Dahası, eğer template<typename U>
templfun üstündeki şeyi kaldırırsam, gcc şikayet etmeyi bırakır.
Bu GCC ile ilgili bir hata mı yoksa yasa dışı kod mu?