Учитывая базовый класс и производный класс, которые оба предоставляют условно разрешенные операторы для определенных типов параметров с использованием SFINAE:
#include <type_traits>
class Base
{
public:
template<class T, std::enable_if_t<std::is_scalar_v<T>>* = nullptr>
void operator>>(T& value) {
}
};
class Derived: public Base
{
public:
using Base::operator>>;
template<class T, std::enable_if_t<!std::is_scalar_v<T>>* = nullptr>
void operator>>(T& value) {
}
};
int main(int argc, char *argv[])
{
int foo;
Base base;
base >> foo; // this works
Derived derived;
derived >> foo; // this doesn't work, the operator from the base class is not considered
}
тогда вызов оператора, определенного в базовом классе, для экземпляра производного класса не будет работать, даже если его нужно было сделать видимым с помощью соответствующего объявления using Base::operator>>;
. Почему? Как можно сделать оператор из базового класса пригодным для использования без повторения объявления/определения?
Проблема не возникает, если рассматриваемый оператор не является шаблоном в базовом классе.
Изменить: протестировано с помощью msvc 15.9.7, а также clang.