Bonjour a tous,
Je n'en suis pas a ma premiere erreur de linkage, en cherchant sur internet j'ai trouvé que ce problème était très récurrent, mais pas vraiment de solution permettant de comprendre comment le compilateur fonctionne...et ainsi éviter les erreurs. En ce qui concerne mon problème actuel voila l'organisation de mes fichiers :
main.cpp :Visualisation.h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #include "GlobalFunctions.h" #include "Visualisation.h" #include "Exception.h" #include <exception>Visualisation.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #include <vector> #include "Sprite.h"Sprite.h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #include "Visualisation.h" #include "Exception.h"et enfin Sprite.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #include <iostream> #include "Structure.h"....jusque la aucun problème de compilation avec des headers ressemblant à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #include "Sprite.h" #include "Exception.h"Maintenant en regardant de plus près ma classe Sprite une erreur apparait si je ne définit pas une spécialisation template directement au sein de ma classe voila un exemple que le compilateur accepte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 #if !defined(MY_VISUALISATOR_H) #define MY_VISUALISATOR_H #pragma onceSi la fonction spécialisée est déclarée "en dehors" de ma fonction :
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 class CSprite { ......... //fonction template : template < bool ALPHA > void drawSprite(BYTE * screen, const int & screenWidth, const int & screenHeight, const int & posX, const int & posY) const; //specialisation template <> void drawSprite<false>(BYTE * screen, const int & screenWidth, const int & screenHeight, const int & posX, const int & posY) const; }; template < bool ALPHA > void CSprite::drawSprite(BYTE * screen, const int & screenWidth, const int & screenHeight, const int & posX, const int & posY) const { .... } template < > void CSprite::drawSprite<false>(BYTE * screen, const int & screenWidth, const int & screenHeight, const int & posX, const int & posY) const { .... }Alors mon compilateur n'accepte plus et me sort trois erreurs de linkage comme je les aimes
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 class CSprite { ......... //fonction template : template < bool ALPHA > void drawSprite(BYTE * screen, const int & screenWidth, const int & screenHeight, const int & posX, const int & posY) const; } template < bool ALPHA > void CSprite::drawSprite(BYTE * screen, const int & screenWidth, const int & screenHeight, const int & posX, const int & posY) const {....} template < > void CSprite::drawSprite<false>(BYTE * screen, const int & screenWidth, const int & screenHeight, const int & posX, const int & posY) const {....}:
Quelqu'un aurait-il des informations qui pourrait m'aider a mieux comprendre comment eviter ces erreurs ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Sprite.obj : error LNK2005: "public: void __thiscall vis::CSprite::drawSprite<0>(unsigned char *,int const &,int const &,int const &,int const &)const " (??$drawSprite@$0A@@CSprite@vis@@QBEXPAEABH111@Z) déjà défini(e) dans main.obj Visualisation.obj : error LNK2005: "public: void __thiscall vis::CSprite::drawSprite<0>(unsigned char *,int const &,int const &,int const &,int const &)const " (??$drawSprite@$0A@@CSprite@vis@@QBEXPAEABH111@Z) déjà défini(e) dans main.obj D:\Mes documents\Visual Studio 2005\Projects\ProjectHAPI\Release\ProjectHAPI.exe : fatal error LNK1169: un ou plusieurs symboles définis à différentes reprises ont été rencontrés
Merci d'avance
A bientot
Partager