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.
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
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; };
Maintenant pour plus de facilité j'ai fais quelque typedefs:
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); }
Et donc, l'utilisation qui ne fonctionne pas:
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;
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 vec3f v0 = vec3f(1.f, 0.f, 0.f); vec3f v1 = vec3f(0.f, 1.f, 0.f); vec3f res = cross_product(v0, v1);
Je pense que l'erreur doit être stupide, mais là j'avoue ne vraiment pas voir.
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)
Est-ce quelqu'un pourrait me donner un petit coup de main ?
Merci d'avance! :-)
Partager