diff --git a/src/quaternion.hpp b/src/quaternion.hpp
index 811bb50dd93dd4ff59fa651786aaac7cedd17f31..b35a767246259dee6a495c16fccbca9ac2d82cd1 100644
--- a/src/quaternion.hpp
+++ b/src/quaternion.hpp
@@ -71,16 +71,16 @@ namespace eigenpy
             "The [] operator numbers them differently, 0...4 for *x* *y* *z* *w*!"))
       
       .add_property("x",
-                    (Scalar (Quaternion::*)()const)&Quaternion::x,
+                    &QuaternionVisitor::getCoeff<0>,
                     &QuaternionVisitor::setCoeff<0>,"The x coefficient.")
       .add_property("y",
-                    (Scalar (Quaternion::*)()const)&Quaternion::y,
+                    &QuaternionVisitor::getCoeff<1>,
                     &QuaternionVisitor::setCoeff<1>,"The y coefficient.")
       .add_property("z",
-                    (Scalar (Quaternion::*)()const)&Quaternion::z,
+                    &QuaternionVisitor::getCoeff<2>,
                     &QuaternionVisitor::setCoeff<2>,"The z coefficient.")
       .add_property("w",
-                    (Scalar (Quaternion::*)()const)&Quaternion::w,
+                    &QuaternionVisitor::getCoeff<3>,
                     &QuaternionVisitor::setCoeff<3>,"The w coefficient.")
       
 //      .def("isApprox",(bool (Quaternion::*)(const Quaternion &))&Quaternion::template isApprox<Quaternion>,
@@ -151,6 +151,9 @@ namespace eigenpy
     template<int i>
     static void setCoeff(Quaternion & self, Scalar value) { self.coeffs()[i] = value; }
     
+    template<int i>
+    static Scalar getCoeff(Quaternion & self) { return self.coeffs()[i]; }
+    
     static Quaternion & setFromTwoVectors(Quaternion & self, const Vector3 & a, const Vector3 & b)
     { return self.setFromTwoVectors(a,b); }