Bonsoir,

Je suis en train de faire un wrapper d'une bibliothèque dans le cadre d'un projet, cependant je me heurte à un petit soucis avec les templates. Je ne sais pas vraiment caractériser ce problème par des mots, je vais donc d'abord montrer le code source de ce que j'ai fais.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
  /** vec
   * \brief Mathematics vectors.
   */
  template <unsigned int Dim, typename T>
  struct vec;
 
  template <typename T>
  struct vec<2, T>
  {
    typedef glm::detail::tvec2<T> value;
    typedef glm::detail::tvec2<T> const& const_ref;
  };
 
  template <typename T>
  struct vec<3, T>
  {
    typedef glm::detail::tvec3<T> value;
    typedef glm::detail::tvec3<T> const& const_ref;
  };
 
  template <typename T>
  struct vec<4, T>
  {
    typedef glm::detail::tvec4<T> value;
    typedef glm::detail::tvec4<T> const& const_ref;
  };
Voici donc la définition de ma classe vector en utilisant la bibliothèque GLM. Maintenant, toujours dans le but de m'éviter de ré-écrire les fonctions, j'ai voulu écrire un wrapper pour la fonction cross product. Cela donne donc:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
  /** Compute the cross product between two vectors.
   * \param left Left vector.
   * \param right Right vector.
   * \return Cross product between left and right.
   */
  template <unsigned int Dim, typename T>
  typename vec<Dim, T>::value
  cross_product( typename vec<Dim, T>::const_ref left
               , typename vec<Dim, T>::const_ref right)
  {
    return glm::cross(left, right);
  }
Maintenant pour plus de facilité j'ai fais quelque typedefs:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
  // 3d vector typedefs.
  typedef vec<3, double>::value vec3d;
  typedef vec<3, float>::value  vec3f;
Et donc, l'utilisation qui ne fonctionne pas:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
  vec3f v0 = vec3f(1.f, 0.f, 0.f);
  vec3f v1 = vec3f(0.f, 1.f, 0.f);
 
  vec3f res = cross_product(v0, v1);
L'erreur étant, je trouve, assez obscure puisque je ne vois pas vraiment où le compilateur veut en venir car pour moi les types sont équivalents:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
Programming/Project/wind/src/demo/main.cxx: In function ‘int main()’:
Programming/Project/wind/src/demo/main.cxx:37:35: error: no matching function for call to ‘cross_product(wind::math::vec3f&, wind::math::vec3f&)’
Programming/Project/wind/src/demo/main.cxx:37:35: note: candidate is:
Programming/Project/wind/include/wind/math/vector.txx:30:55: note: template<unsigned int Dim, class T> typename wind::math::vec::value wind::math::cross_product(typename wind::math::vec<Dim, T>::const_ref, typename wind::math::vec<Dim, T>::const_ref)
Je pense que l'erreur doit être stupide, mais là j'avoue ne vraiment pas voir.
Est-ce quelqu'un pourrait me donner un petit coup de main ?

Merci d'avance! :-)