Розглянемо 2 наступні перевантаження
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
Перший працює для звичайних занять, а другий - для шаблонів, які не є інстанційними. Наприклад:
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
Тепер розглянемо наступну функцію шаблону:
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
У GCC він дає помилку за неоднозначну роздільну здатність перевантаження, тоді як Кланг компілює. Цікаво, що другий виклик тестувати () не призводить до помилок (навіть у GCC). Більше того, якщо я template<typename U>
видаляю річ поверх templfun, gcc перестає скаржитися.
Це помилка з GCC чи це незаконний код?