Перегрузка функций полиморфными шаблонами - PullRequest
2 голосов
/ 10 сентября 2010

Почему следующий код не компилируется и как можно использовать функцию из базового класса?

template<typename K> struct Base
{
    K foo() { return (K)0; }
};

template<typename K> struct Extension
: public Base<K>
{
    K foo(int a) { return (K)a; }
};

int main()
{
    Extension<float> e;
    e.foo();
    return 0;
}

Редактировать: Хорошо, я думал, что это толькопроисходит с шаблонными классами ... В чем заключается идея решения о том, чтобы скрыть версию базового класса по перегруженной версии от дочернего класса?Я имею в виду, что объявление обеих функций в одном классе прекрасно работает.

Ответы [ 4 ]

3 голосов
/ 10 сентября 2010

Либо добавьте объявление об использовании, как показано в других ответах, либо сделайте вызов, используя полное имя

e.Base<float>::foo();
3 голосов
/ 10 сентября 2010

Extension::foo скрывается Base::foo. Вы можете использовать delaration, чтобы вернуть его:

template<typename K> struct Extension
: public Base<K>
{
    using Base<K>::foo;
    K foo(int a) { return (K)a; }
};

Пункт 33 («Избегайте сокрытия унаследованных имен») в «Эффективном C ++» Скотта Мейерса посвящен этой проблеме.

1 голос
/ 10 сентября 2010

foo из Extension скрывает foo от базы.

Добавление условия использования в Extension устраняет ошибку компиляции.

template<typename K> struct Base
{
    K foo(void) { return (K)0; }
};

template<typename K> struct Extension
: public Base<K>
{
    using Base<K>::foo;
    K foo(int a) { return (K)a; }
};

int main()
{
    Extension<float> e;
    e.foo();
    e.foo(1);
    return 0;
}
0 голосов
/ 10 сентября 2010

похоже, что Base :: foo () является приватным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...