Considere as 2 seguintes sobrecargas
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
O primeiro trabalha para classes regulares, enquanto o segundo trabalha para modelos que não são instanciados. Por exemplo:
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
Agora considere a seguinte função de modelo:
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
No GCC, ocorre um erro para a resolução ambígua de sobrecarga, enquanto Clang compila. Curiosamente, a segunda chamada para test () não produz erros (mesmo no GCC). Além disso, se eu remover a template<typename U>
coisa em cima do templfun, o gcc para de reclamar.
Isso é um bug do GCC ou é um código ilegal?