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