Ошибка при доступе к функции-члену базового класса

Есть два шаблона классов: базовый и потомок. В потомке вызывается функция базового:

template<typename Tp>
class Base
{
protected:
    void base_proc()
    { return; }
};

template<typename Tp>
class Derived : protected Base<Tp>
{
public:
    void derived_proc()
    {
        base_proc();
    }
};

int main()
{
    Derived<int> id;
    id.derived_proc();
}

Компилятор выдает такую ошибку:

error: there are no arguments to ‘base_proc’ that depend on a template parameter, so a declaration of ‘base_proc’ must be available [-fpermissive]

в чем может быть проблема?


Ответы (1 шт):

Автор решения: KoD

Дело в том, что при разрешении имени base_proc() в теле derived_proc(), она никогда не рассматривается как член Базового класса. Как правило, компилятор считает ее как глобально определенную функцию void base_proc(). В данном случае для решения проблемы следует полностью квалифицировать имена членов базовых классов Base::base_proc(), или использовать конструкцию this->

void derived_proc()
{
    Base<Tp>::base_proc();
}

или так:

void derived_proc()
{
    this->base_proc();
}
→ Ссылка