Наследование, шаблоны и виртуальные функции (это может запутаться) - PullRequest
4 голосов
/ 31 августа 2010

Просто разбираюсь с шаблонами, поэтому пробовал несколько вещей.

Дайте мне знать, что я здесь делаю неправильно.

Я пытаюсь перегрузить унаследованные шаблоны виртуальным методом.

// class templates
#include <iostream>
using namespace std;

template <class T, class A>
class mypair {
    T a, b;
  public:
    mypair (T first, T second)
      {a=first; b=second;}
    virtual A getmax (); 
};

template <class T, class A>
A mypair< T, A>::getmax ()
{
  A retval;
  retval = a>b? a : b;
  return retval;
}



template <class T, class A>
class next : public mypair <T, A> {
        A getmax ()
        {   
        cout <<" WHOO HOO";
        }   
};


int main () {
  mypair <double,float> myobject(100.25, 75.77);
  next<double,float>  newobject(100.25, 75.77);
  cout << myobject.getmax();
  return 0;
}

`

Это дает ошибку:

function.cpp: In function ‘int main()’:
function.cpp:35: error: no matching function for call to ‘next<double, float>::next(double, double)’
function.cpp:25: note: candidates are: next<double, float>::next()
function.cpp:25: note:                 next<double, float>::next(const next<double, float>&)

Если это неправильный способ, некоторая информация о наследовании шаблонов будет отличной

Ответы [ 2 ]

7 голосов
/ 31 августа 2010

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

Если вы хотите определить конструктор из next, который занимает два T с и перенаправляет их в соответствующий mypairконструктор, вы бы сделали это так:

next (T first, T second)
  : mypair<T,A>(first, second)
{
}

Опять же, это обычно применимо даже без использования шаблонов.

3 голосов
/ 31 августа 2010

Полное решение, если кому-то интересно (спасибо Тайлеру)

// class templates
#include <iostream>
using namespace std;

template <class T, class A>
class mypair {
         T a, b;
  public:
    mypair (T first, T second)
      {a=first; b=second;}
    virtual A getmax (); 
};

template <class T, class A>
A mypair< T, A>::getmax ()
{
  A retval;
  retval = a>b? a : b;
  return retval;
}







template <class T, class A>
class next: mypair<T,A>
{
public:

        next (T first, T second) : mypair<T,A>(first, second)
        {   
        }   

        A getmax ()
        {   
        cout<<"WOO HOO";
        }   
};


int main () {
  mypair <double,float> myobject(100.25, 75.77);
  next<double,float>  newobject(100.25, 75.77);
  cout << newobject.getmax();
  return 0;
} 
...