Problème avec fonction virtuel et héritage template
Bonjour,
Dans le cadre du développement d'un moteur physique je suis en train de mettre en place l'organisation des résolutions numérique (Euler, RK2, RK4, ...)... Pour ce faire je code une classe abstraite :
NumericalSolver.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #ifndef __NUMERICALSOLVER_H__
#define __NUMERICALSOLVER_H__
#include "Vector3D.h"
namespace VM
{
template <class T>
class NumericalSolver
{
public://protected :
NumericalSolver(T (*f)(T, T), T, T);
virtual ~NumericalSolver();
T (*dY) (T, T); // dy/dt
T Y; // y
T dt; // différentiel de temps
public :
virtual void Next() = 0; // Calculer la position suivante
};
#include "NumericalSolver.hpp"
}
#endif |
NumericalSolver.hpp
Code:
1 2 3 4
| template <class T>
NumericalSolver<T>::NumericalSolver(T (*f)(T, T), T dt, T y) : dY(f), dT(dt), Y(y)
{
} |
Jusqu'ici je n'est pas de problème mais lorsque j'ai une classe héritière par exemple Euler.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #ifndef __EULER_H__
#define __EULER_H__
#include "NumericalSolver.h"
namespace VM
{
template <class T>
class Euler : public NumericalSolver<T>
{
public :
Euler();
virtual ~Euler();
void Next(); // Y(n+dt)
};
#include "Euler.hpp"
}
#endif |
Euler.hpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| template <class T>
Euler<T>::Euler() : NumericalSolver<T>(NULL, 0.01, 0)
{}
template <class T>
Euler<T>::~Euler()
{}
template <class T>
void Euler<T>::Next()
{
Y += dY(Y, dt)*dt;
} |
Citation:
Envoyé par gcc
Euler.hpp:12: error: `Y' undeclared (first use this function)
Euler.hpp:12: error: (Each undeclared identifier is reported only once for each function it appears in.)
Euler.hpp:12: error: `dt' undeclared (first use this function)
Euler.hpp:12: error: there are no arguments to `dY' that depend on a template parameter, so a declaration of `dY' must be available
Euler.hpp:12: error: (if you use `-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
J'ai essayé de codé l'instance de la fonction Euler<T>::Next() directement dans la classe mais toujours le problème du gcc ne voit pas mon Y, mon dt, ...
Je voudrais savoir où est-je commis une erreur.
Merci à tous ceux qui lirons et répondrons.