Bonjour,
Je suis en train de redesigner une partie de mon code. Pour l'instant j'ai :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
template <typename REAL, unsigned D> class Vector
{
   REAL m_data[D];
};
 
///Cross product
template<typename REAL> Vector<REAL,3> operator ^(const Vector<REAL,3>& p_v1, const Vector<REAL,3>& p_v2);
Le cross product n'est défini que pour les vecteurs en 3D. Ce que j'aimerais faire, c'est déplacer quand même l'opérateur dans la classe, de cette facon :
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
template <typename REAL, unsigned D> class Vector
{
   REAL m_data[D];
public:
   Vector<REAL,D> operator ^(const Vector<REAL,D>& p_vect);
};
 
///Cross product
template<typename REAL> Vector<REAL,3> Vector<REAL,3>::operator ^(const Vector<REAL,3>& p_vect)
{
   ...
}
 
///Voir même éventuellement si besoin
template<typename REAL> Vector<REAL,2> Vector<REAL,2>::operator ^(const Vector<REAL,2>& p_vect)
{
   ...
}
Le but est de faire un genre de spécialisation de template, et d'avoir une erreur de linkage si quelqu'un essaie de faire un crossproduct sur des Vectors a autre chose que 3D.
L'erreur que j'ai c'est "Invalid use of incomplete type Vector<float, 3u>" (g++). Je ne comprend pas vraiment le message, la définition de la classe est extérieure à la classe, il devrait normalement avoir ce qu'il lui faut pour instancier le template.
Est ce possible de faire une spécialisation partielle d'un membre d'une classe ? Si oui comment, et sinon pourquoi pas ?