Рассмотрим этот пример шаблона класса, содержащего функцию-член и шаблон функции-члена, оба из которых названы f
с последующей попыткой определить и специализировать шаблон функции-члена:
template<typename T>
struct A {
void f();
template<typename U>
void f();
};
template<>
template<typename U>
void A<double>::f() { }
template<>
template<>
void A<double>::f<int>() { }
Isэто законно?Как записать определение шаблона функции-члена?
В первом определении f
объявление шаблона гарантирует, что шаблон функции-члена f
должен быть выбран, а не функция-член f
дажехотя параметр шаблона не отображается в типе?Я не вижу способа дальнейшего устранения этой неоднозначности, поскольку написание ::template f()
, ::f<U>()
, ::f<>()
или их комбинации, похоже, не помогает.
Результаты компилятора:
- clang: сбой с трассировкой стека по специализации
f<int>
- Visual Studio: успешная компиляция
- gcc: ошибка компиляции (неопределенность относительно определения
f
) впервое определение f
- EDG: компилируется успешно
В отличие от этого, каждый компилятор принимает эквивалент в области имен пространства:
namespace X {
void f();
template<typename T>
void f();
}
template<typename T>
void X::f() { }
template<>
void X::f<int>() { }