LINUX.ORG.RU

Перегрузка вирт функции в шаблоне


0

1

Подскажите почему это не компилируется

#include <iostream>
using namespace std;

class Logger
{
public:

    int logger()
    { return 5; }

    virtual void logger(int)
    { ; }

    virtual ~Logger(){}
};

template <typename T>
class Base: public Logger
{
public:
    virtual void logger(int)
    { ; }

    virtual ~Base(){}
};

class Derived: public Base<int>
{
public:
    void f()
    {
        logger(logger());
    }
};

int main() {

    Derived d;
    d.f();
}
../src/overload_fin_template.cpp:40:23: ошибка: нет подходящей функции для вызова «Derived::logger()»
../src/overload_fin_template.cpp:40:23: замечание: candidate is:
../src/overload_fin_template.cpp:29:18: замечание: void Base<T>::logger(int) [with T = int]
../src/overload_fin_template.cpp:29:18: замечание:   candidate expects 1 argument, 0 provided
make: *** [src/overload_fin_template.o] Ошибка 1

Если в Base убрать перезрузку метода virtual void logger(int) то все как бы работает (собстно как и ожидалось).

Выжно, что

    int logger()
    { return 5; }

    virtual void logger(int)
    { ; }
имееют одинаковое имя, если сделать разные то компилируется.


Ответ на: комментарий от nanoolinux

не понял. Я же не делаю шаблонную виртуальную функцию.

Разве виртуальная функция в шаблоне == шаблонная виртуальная функция? На сколько мне известно - нет.

Cupper ()
Ответ на: комментарий от nanoolinux

так собирается, но неприятный осадочек в душе все равно остался.

Выглядит так что (виртуальная)функция в шаблонном класса, перекрывает все остальные (унаследованные) с таким же именем, и не важно с какой сигнатурой.

Cupper ()
Ответ на: комментарий от Cupper
#include <iostream>
using namespace std;

class Logger
{
public:

    int logger()
    { return 5; }

    virtual void logger(int)
    { ; }

    virtual ~Logger(){}
};

template <typename T>
class Base: public Logger
{
public:
    virtual void logger(int)
    { ; }
    using Logger::logger;

    virtual ~Base(){}
};

class Derived: public Base<int>
{
public:
    void f()
    {
        logger(logger());
    }
};

int main() {

    Derived d;
    d.f();
}
NegatiV ()
Ответ на: комментарий от Cupper

cpp
неприятный осадочек в душе

О сколько нам открытий чудных
Готовят просвещенья дух

© Олександр Сергійович Гарматний.

nanoolinux ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.