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
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
- 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
 
#include "NS1Class.h"
namespace NS1
{
NS1Class::NS1Class()
{
}
NS1Class::~NS1Class()
{
}
void NS1Class::method()
{
	cout<<"method NS1class\n";
}
}
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:
- voici le fichier .h
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
- 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
 
#include "NS2Class1.h"
 
namespace NS2
{
NS2Class::NS2Class()
{
 ns1 = new NS1Class();
}
NS2Class::~NS2Class()
{
}
void NS2Class::method()
{
	cout<<"method NS2 class\n";
}
}
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!!

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 :

>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
- 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

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...