объявление использования для перегруженного шаблона унаследованной функции приводит к «неоднозначному вызову перегруженной функции» - PullRequest
0 голосов
/ 30 января 2019

У меня есть шаблон базового класса 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 или любые более новые стандарты.

...