Рассмотрим следующий пример:Используется ли `using Base :: operator T`, где` T` является параметром типа шаблона?
struct B { operator int(); };
template<class T>
struct X:B
{
using B::operator T;
};
GCC принимает код, в то время как Clang и MSVC отвергает его. Что именно?
Обратите внимание, что если базовый тип зависит, все составители принимают код:
template<class T>
struct B { operator T(); };
template<class T>
struct X:B<T>
{
using B<T>::operator T;
};
Если вы делаете 'operator int()' в 'B' шаблонизированной функцией преобразования (например,' template operator T(); '), он работает, и если вы специализируетесь на этом для' int', он также работает и вызывается специализация, тогда как, насколько я понимаю, стандарт запрещает ее (* «Так как специализации шаблонов членов для функций преобразования не найдены при поиске по имени, они не учитываются, когда декларация использования указывает функцию преобразования (14.5.2) . "*). Кроме того, clang может найти 'operator T', если вы вызываете его в функции-члене, поэтому я думаю, что gcc прав. –
Holt