У меня есть шаблон базового класса C
, который реализует несколько перегрузок функции c()
, из которых одна является шаблоном функции, и подкласс D
, который наследуется от C и повторно реализует шаблон функции.D::c()
вызывает скрытие всех перегрузок C::c()
в D
.Так как я хочу, чтобы перегрузки, которые не были повторно реализованы D
, не были скрыты, D
делает их доступными через using C<D>::c
;
Это прекрасно работает, если все перегрузки c()
не являются шаблоннымифункции: Базовые реализации доступны пользователям D для перегрузок, которые D
не реализует повторно, но для перегрузок, которые реализует D
, реализация из C
становится недоступной для пользователей D, а реализация изВместо него используется D
.
Однако, если повторно реализованная функция является шаблоном функции, то такой же подход приводит к ошибке компилятора в MSVC.
"ambiguous call to overloaded function
could be 'void D::c<int>(FT)
or 'void C::c<int>(FT)'"
Как видно с шаблонами,Реализация C
остается доступной для D
пользователей и конфликтует с повторной реализацией в D
.
template<typename T>
class C
{
public:
void c(void){}
template<typename FT> void c(FT param){}
};
class D : public C<D>
{
public:
using C<D>::c;
template<typename FT> void c(FT param){}
};
int main()
{
D d;
d.c<int>(1);
}
, clang и G ++ прекрасно компилируют этот код, в то время как MSVC 11, 12, 14 и15 все не в состоянии скомпилировать.Упрощенная версия кода, в которой C
является не шаблоном, а обычным классом, все еще не компилируется в MSVC 11 и 12, но прекрасно компилируется в MSVC 14 и 15.
При обычном подходене работает, есть ли лучший подход в C ++ 03 для повторной реализации шаблона унаследованной перегруженной функции, чем воздерживаться от использования using C<D>::c
и вместо этого добавлять повторные реализации для всех перегрузок, некоторые из которых не делают ничего, кроме как просто вызывают свою базуреализация?
Примечание: я не могу использовать C ++ 11 или любые более новые стандарты.