У меня есть три разных компилятора, которые я использую для компиляции этого кода. Один из них (тот, которому я доверяю меньше всего) предупреждает, что функция в Derived скрывает функцию в Base. Другие компиляторы (один Visual С++) не предупреждают. Visual С++ даже не дает предупреждения об этом, если я включаю /Wall или/W4.
Я склонен полагать, что это ошибка в компиляторе, которая дает предупреждение, поскольку он компилирует код. Если это действительно не переопределило базовую функцию, тогда она должна дать ошибку, когда я создаю экземпляр производного шаблона.
Может ли кто-нибудь подтвердить, как это должно себя вести?
struct Base
{
virtual void Func(float f) = 0;
};
template <typename T>
struct Derived : Base
{
virtual void Func(T f){}
};
int main()
{
Derived<float> d;
d.Func(0);
return 0;
}
Когда Derived
создается с помощью float
, я получаю неожиданное предупреждение. Когда Derived
создается с помощью int
, я получаю ошибку, как и ожидалось.