Странное затенение не виртуальной функции виртуальной функцией в gcc 4.7.2

0

Интересно, это очень странная (для меня) языковая функция или ошибка компилятора:

#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
Теги:
gcc
inheritance

1 ответ

1

Он не назывался затенением, а скрывался, и да, это функция языка.

Вы можете сделать базовую функцию доступной с 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";  }
};

Ещё вопросы

Сообщество Overcoder
Наверх
Меню