C++, template et pointeur

Page principale

Répondre à ce message
Auteur: Frédéric
Date:  
À: Guilde
Sujet: C++, template et pointeur
Hello,

Pour résoudre un souci de callback Arduino, et plus précisément pour
pouvoir utiliser une méthode d'objet comme routine d'interruption, Edgar
m'avait proposé la solution suivante :

class Encoder
{
    public:
        Encoder(uint8_t pin): m_pin(pin) {}
        template <Encoder& instance> static void begin() {
            auto isr = []() { instance.encoderISR(); };
            attachInterrupt(digitalPinToInterrupt(instance.m_pin), isr, CHANGE);
        }


    private:
        uint8_t m_pin;
};


Ça 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 ?

Encoder::begin<*m_encoder>();

sort l'erreur :

-----------------

closedLoopMotor.cpp: error: use of 'this' in a constant expression
     Encoder::begin<*m_encoder>();
                     ^~~~~~~~~
error: no matching function for call to 'Encoder::begin<(*((ClosedLoopMotor*)this)->ClosedLoopMotor::m_encoder)>()'
     Encoder::begin<*m_encoder>();
                                ^
encoder.h:8:46: note: candidate: template<Encoder& instance> static void Encoder::begin()
     template <Encoder& instance> static void begin()
                                              ^~~~~
encoder.h:8:46: note:   template argument deduction/substitution failed:
closedLoopMotor.cpp: error: '*((ClosedLoopMotor*)this)->ClosedLoopMotor::m_encoder' is not a valid template argument for type 'Encoder&' because it is not an object with linkage
     Encoder::begin<*m_encoder>();
                                ^
exit status 1
use of 'this' in a constant expression


-----------------

Une idée de ce qui coince ?

Merci d'avance.

-- 
    Frédéric