Rozważmy przykład:Czy "używanie Base :: operator T" jest dozwolone, gdzie `T` jest parametrem typu szablonu?
struct B { operator int(); };
template<class T>
struct X:B
{
using B::operator T;
};
GCC przyjmuje kod, a Clang i MSVC odrzuca. Co jest poprawne?
Zauważ, że jeśli typ bazowy jest zależny, wszystkie kompilatory zaakceptować kod:
template<class T>
struct B { operator T(); };
template<class T>
struct X:B<T>
{
using B<T>::operator T;
};
Jeśli użyjesz 'operatora int()' w 'B' funkcji szablonowej konwersji (np.' Template operator T(); ') działa, a jeśli wyspecyfikujesz to dla' int', to również działa i wywołuje specjalizacja, o ile rozumiem, standard go zabrania (* "Ponieważ specjalizacje szablonów członków dla funkcji konwersji nie są odnajdywane przez wyszukiwanie nazw, nie są uwzględniane, gdy deklaracja użycia określa funkcję konwersji (14.5.2) . "*). Również clang może znaleźć 'operator T' jeśli wywołasz go w funkcji składowej, więc myślę, że gcc ma rację. –
Holt