Considere las 2 siguientes sobrecargas
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
El primero funciona para clases regulares, mientras que el segundo funciona para plantillas que no se instancian. Por ejemplo:
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
Ahora considere la siguiente función de plantilla:
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
En GCC da un error para la resolución de sobrecarga ambigua, mientras que Clang compila. Curiosamente, la segunda llamada a test () no produce errores (incluso en GCC). Además, si template<typename U>
elimino la cosa encima de templfun, gcc deja de quejarse.
¿Es esto un error con GCC o es un código ilegal?