Si vous définissez une fonction libre (pas un membre d'une classe), elle doit être définie dans un fichier .cpp compilé séparément, ou dans un en-tête et marqué en ligne. Donc, dans votre cas, vous pouvez vous rendre la compilation par ceci:
inline Vector3d cross(const Vector3d &v0, const Vector3d &v1) {
float x,y,z;
x = v0.y*v1.z-v0.z*v1.y;
y = v0.z*v1.x-v0.x*v1.z;
z = v0.x*v1.y-v0.y*v1.x;
return Vector3d(x,y,z);
}
L'erreur est due au fait que vous avez la définition de la fonction dans l'en-tête, mais n'a pas marqué, il en ligne. Si vous incluez maintenant cet en-tête dans deux fichiers compilés séparément, l'éditeur de liens, en essayant de lier les fichiers objets compilés, va renvoyer une erreur, car il voit alors une fonction croisée définie deux fois.
Cela fonctionne sans mettre automatiquement en ligne les fonctions membres d'une classe, car les fonctions membres définies dans la définition de la classe sont implicitement en ligne.
Cependant, il n'est généralement pas judicieux de définir des définitions de fonction dans l'en-tête. Si votre fonction dépend d'autres types que le vecteur (dans votre cas c'est bien IMHO, mais c'est discutable bien sûr - certaines personnes ne l'aiment pas), alors vous devrez inclure les en-têtes pour ces types. Cela va inutilement gonfler le code qui est indirectement inclus par votre en-tête. Au lieu de cela, dans ces cas, vous ne placeront une seule déclaration de votre fonction dans l'en-tête:
Vector3d cross(const Vector3d &v0, const Vector3d &v1);
Mais définir dans le fichier .cpp qui est compilé séparément. L'inline, bien sûr, devrait ensuite être abandonné.
Permettez-moi d'ajouter une petite liste des définitions et des déclarations, juste pour aider à garder les choses claires sur ce que la déclaration et la définition des moyens pour les fonctions et les classes. Notez que chaque définition est également une déclaration, mais pas l'inverse:
// class _declaration_ of boo
class boo;
// class _definition_ of foo.
class foo {
// member function _declaration_ of bar
void bar();
// member function _definition_ of baz
void baz() { }
};
// function _definition_ of fuzz
inline void fuzz() { }
// function _declaration_ of fezz
void fezz();
en ligne travaillé. Merci – cbrulak