problème de LINKER lors de l'utilisation d'un namespace dans une projet C++
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:
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:
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:
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:
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 :
Citation:
>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...:P