diff --git a/src/multibody/joint/joint-base.hpp b/src/multibody/joint/joint-base.hpp
index d8aeafda059e5317807ae73d029ecad66913d652..f1aaab9dd3fd2a35217f4a779aac9478289a60ff 100644
--- a/src/multibody/joint/joint-base.hpp
+++ b/src/multibody/joint/joint-base.hpp
@@ -45,6 +45,7 @@ namespace se3
    * internal::ActionReturn<Constraint>::Type
    * Constraint::se3Action
    */
+#ifdef __clang__
 
 #define SE3_JOINT_TYPEDEF_ARG(prefix)					     \
   typedef int Index;						     \
@@ -63,6 +64,27 @@ namespace se3
 #define SE3_JOINT_TYPEDEF SE3_JOINT_TYPEDEF_ARG()
 #define SE3_JOINT_TYPEDEF_TEMPLATE SE3_JOINT_TYPEDEF_ARG(typename)
 
+#else
+
+#define SE3_JOINT_TYPEDEF_ARG()              \
+  typedef int Index;                 \
+  typedef typename traits<Joint>::JointData JointData;         \
+  typedef typename traits<Joint>::JointModel JointModel;       \
+  typedef typename traits<Joint>::Constraint_t Constraint_t;       \
+  typedef typename traits<Joint>::Transformation_t Transformation_t; \
+  typedef typename traits<Joint>::Motion_t Motion_t;         \
+  typedef typename traits<Joint>::Bias_t Bias_t;         \
+  typedef typename traits<Joint>::F_t F_t;           \
+  enum {                   \
+    NQ = traits<Joint>::NQ,              \
+    NV = traits<Joint>::NV               \
+  }
+
+#define SE3_JOINT_TYPEDEF SE3_JOINT_TYPEDEF_ARG()
+#define SE3_JOINT_TYPEDEF_TEMPLATE SE3_JOINT_TYPEDEF_ARG()
+
+#endif
+
 #define SE3_JOINT_USE_INDEXES \
     typedef JointModelBase<JointModel> Base; \
     using Base::idx_q; \