Интересно, это очень странная (для меня) языковая функция или ошибка компилятора:
#include <iostream>
template<class T>
class A{
public:
virtual void func(T const & x)
{ std::cout << "A func: " << x << "\n"; }
void func(T const &x, T const & y)
{ std::cout << "Double func:\n";
func(x); func(y);
}
};
template<class T>
class B : public A<T>{
public:
virtual void func(T const & x)
{ std::cout << "B func: " << x << "\n"; }
};
int main(){
A<int> a;
a.func(1);
a.func(2,3);
B<int> b;
b.func(1);
b.func(2,3);
}
Оба a.func(1) и a.func(2,3) работают отлично. Но b.func(2,3) производит:
3.c++: In function ‘int main():
3.c++:27:13: error: no matching function for call to ‘B<int>::func(int, int)
3.c++:27:13: note: candidate is:
3.c++:20:16: note: void B<T>::func(const T&) [with T = int]
3.c++:20:16: note: candidate expects 1 argument, 2 provided
Он не назывался затенением, а скрывался, и да, это функция языка.
Вы можете сделать базовую функцию доступной с using
директивы using
:
template<class T>
class B : public A<T>{
public:
using A<T>::func; // <----------------
virtual void func(T const & x)
{ std::cout << "B func: " << x << "\n"; }
};