Bonjour !
Frédéric a écrit :
> [class Encoder { template <Encoder& instance> static void begin(); }]
> marche très bien si on appelle la méthode statique Encoder::begin()
> avec une référence sur un objet Encoder, mais comment faire pour
> l'appeler si on ne dispose que d'un pointeur sur un objet Encoder ?
Une ISR étant une fonction nue, les seules données auxquelles elle peut
accéder sont des variables globales ou statiques, dont l'adresse est
connue à la compilation. J'ai l'impression que tu es en train d'essayer
de contourner cette limitation par tous les moyens, mais ça ne pourra
jamais marcher.
> m_encoder = new Encoder(encoderPinA, encoderPinB, ticksPerTurn);
> Encoder::begin<*m_encoder>();
Un paramètre de template doit aussi être une constante connue à la
compilation. Tu ne peux pas utiliser quelque chose qui est créé
dynamiquement. Si tu veux appeler Encoder::begin() depuis un
constructeur (pas sûr que ce soit une bonne idée), tu pourrais
transformer la classe ClosedLoopMotor en un template:
template <Encoder& encoder>
class ClosedLoopMotor
{
public:
ClosedLoopMotor(uint8_t, uint8_t, uint16_t);
};
template <Encoder& encoder>
ClosedLoopMotor<encoder>::ClosedLoopMotor()
{
Encoder::begin<encoder>();
}
À+,
Edgar.