Bonjour à tous
je suis actuellement confrontée à un petit problème relatif à l'utilisation des namespaces en C++.
Plus particulièrement, je me retrouve face à un problème de "LINKER" à la création, dans un namespace X, d'un objet défini dans un namespace Y...
Comme j'ai un peu de mal à formuler clairement ma question, je préfère le faire par la biais d'un exemple très simple :
J'ai crée un projet C++ (sous visual C++ 2008) nommé NS1 dans lequel j'ai défini un namespace appelée NS1 et dans lequel j'ai implémenté la classe que j'ai nommé NS1Class :
- voici le fichier .h
- et voici le fichier .cpp
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 #ifndef __NS1CLASS_H__ #define __NS1CLASS_H__ #include <stdio.h> #include <windows.h> #include <iostream> using namespace std; namespace NS1 { class NS1Class { public: NS1Class(); ~NS1Class(); void method(); }; }//end namespace NS1 #endif
Ensuite j'ai crée un projet C++ (également sous visual C++ 2008) nommé NS2 dans lequel j'ai défini un namespace appelée NS2 et dans lequel j'ai implémenté la classe que j'ai nommé NS2Class. Cette classe a pour attribut un pointeur sur un objet de type NS1:
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 #include "NS1Class.h" namespace NS1 { NS1Class::NS1Class() { } NS1Class::~NS1Class() { } void NS1Class::method() { cout<<"method NS1class\n"; } }
- voici le fichier .h
- et voici le fichier .cpp
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 #ifndef __NS2CLASS_H__ #define __NS2CLASS_H__ #include <stdio.h> #include <windows.h> #include <iostream> #include "NS1Class.h" using namespace std; using namespace NS1; namespace NS2 { class NS2Class { private: NS1Class * ns1; public: NS2Class(); ~NS2Class(); void method(); }; }//end namespace NS2 #endif
Note: Dans les propriétés de mon projet NS2, j'ai bien mis dans C/C++>>Général >> Autres fichier include le dossier relatif au projet NS1!!
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 #include "NS2Class1.h" namespace NS2 { NS2Class::NS2Class() { ns1 = new NS1Class(); } NS2Class::~NS2Class() { } void NS2Class::method() { cout<<"method NS2 class\n"; } }
Je n'ai pas de problème de compilation. En revanche, quand je "génère" la solution, je suis confrontée à l'erreur suivante :
- en supprimant la ligne "ns1 = new NS1Class();", je n'ai plus ce problème... ce qui m'a amené à conclure que cette erreur était liée à l'instanciation de mon objet>NS2Class.obj : error LNK2019: symbole externe non résolu "public: __thiscall NS1::NS1Class::NS1Class(void)" (??0NS1Class@NS1@@QAE@XZ) référencé dans la fonction "public: __thiscall NS2::NS2Class::NS2Class(void)" (??0NS2Class1@NS2@@QAE@XZ)
1>D:\Documents\Visual Studio 2008\Projects\TestNamespaces\Debug\TestNamespaces.exe : fatal error LNK1120: 1 externes non résolus
je ne sais pas du tout comment faire pour résoudre ce problème. J'ai cherché sur développez.com et autre forum... Ce problème a déjà été mentionné dans des discussions ultérieures mais je n'ai pas trouvé les références qui proposaient une solution...
donc si jamais vous avez une idée pour résoudre ce problème...
Partager