Rozważ 2 następujące przeciążenia
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
Pierwszy działa dla klas regularnych, a drugi dla szablonów, które nie są tworzone. Na przykład:
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
Teraz rozważ następującą funkcję szablonu:
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
W GCC daje błąd przy niejednoznacznej rozdzielczości przeciążenia, podczas gdy Clang kompiluje. Co ciekawe, drugie wywołanie test () nie powoduje błędów (nawet w GCC). Co więcej, jeśli template<typename U>
usunę coś na templfun, gcc przestanie narzekać.
Czy to błąd w GCC, czy to nielegalny kod?