OVH Cloud OVH Cloud

Namespaces

6 réponses
Avatar
Zouplaz
Bonjour, j'ai décidé d'utiliser un namespace pour une petite librarie
complémentaire d'un projet perso.

Voici un exemple de la manière dont je déclare mes bidules :

// fichier Stuff2D.h
namespace SDLWidgets
{

class Stuff2D
{
public:
Stuff2D(void);
~Stuff2D(void);

virtual bool load(std::string fileName) = 0;

[SNIP]
};
}

// fichier Stuff2D.cpp
namespace SDLWidgets
{

Stuff2D::Stuff2D(void)
{
}

Stuff2D::~Stuff2D(void)
{
}

[SNIP]

}

Ensuite, je dérive de Stuff2D une classe nommée Sprite2D, et les
directives namespace sont identiques à celles ci dessus

// fichier main.cpp

#include "../SDLWidgets/src/Sprite2D.h"
using namespace SDLWidgets;

int main(int argc, char *argv[])
{
Sprite2D* sp1 = new Sprite2D();
return 0;
}


ICI PROBLEME : le linker me dit que le constructeur de Sprite2D n'est pas
résolu.
Si je déclare sp1 comme
Sprite2D sp1;
alors le linker se plaint aussi du fait qu'il n'a pas trouvé de
destructeur.

Enfin, ce que je ne comprends pas c'est qu'un appel comme
sp1->load("sprite.bmp");
ne pose quand à lui aucun problème !!!
Que ce passe-t-il avec les constructeurs et destructeurs ?? Je suppose
que c'est en relation avec les espaces de nom ?!

Si vous avez une solution, merci.

6 réponses

Avatar
Zouplaz
Juste pour info complémentaire, l'erreur est exactement celle ci :
testWidgets error LNK2019: symbole externe non résolu "public: __thiscall
SDLWidgets::Sprite2D::Sprite2D(void)" (??@@)
Avatar
Alexandre
"Zouplaz" a écrit dans le message de
news:
Bonjour, j'ai décidé d'utiliser un namespace pour une petite librarie
complémentaire d'un projet perso.

Voici un exemple de la manière dont je déclare mes bidules :

// fichier Stuff2D.h
namespace SDLWidgets
{

class Stuff2D
{
public:
Stuff2D(void);
~Stuff2D(void);

virtual bool load(std::string fileName) = 0;

[SNIP]
};
}

// fichier Stuff2D.cpp
namespace SDLWidgets
{

Stuff2D::Stuff2D(void)
{
}

Stuff2D::~Stuff2D(void)
{
}

[SNIP]

}

Ensuite, je dérive de Stuff2D une classe nommée Sprite2D, et les
directives namespace sont identiques à celles ci dessus

// fichier main.cpp

#include "../SDLWidgets/src/Sprite2D.h"
using namespace SDLWidgets;

int main(int argc, char *argv[])
{
Sprite2D* sp1 = new Sprite2D();
return 0;
}


ICI PROBLEME : le linker me dit que le constructeur de Sprite2D n'est pas
résolu.
Si je déclare sp1 comme
Sprite2D sp1;
alors le linker se plaint aussi du fait qu'il n'a pas trouvé de
destructeur.

Enfin, ce que je ne comprends pas c'est qu'un appel comme
sp1->load("sprite.bmp");
ne pose quand à lui aucun problème !!!
Que ce passe-t-il avec les constructeurs et destructeurs ?? Je suppose
que c'est en relation avec les espaces de nom ?!

Si vous avez une solution, merci.



Comment est déclaré ton constructeur de Sprite2D ?

Avatar
Zouplaz
Alexandre - :


Comment est déclaré ton constructeur de Sprite2D ?



Comme ceci :

public:
Sprite2D(void);
~Sprite2D(void);

J'ai également le même problème avec une classe statique ne dérivant de
rien. Même erreur...

Avatar
Benoit Rousseau
Zouplaz wrote:
Bonjour, j'ai décidé d'utiliser un namespace pour une petite librarie
complémentaire d'un projet perso.

[...]

ICI PROBLEME : le linker me dit que le constructeur de Sprite2D n'est pas
résolu.
Si je déclare sp1 comme
Sprite2D sp1;
alors le linker se plaint aussi du fait qu'il n'a pas trouvé de
destructeur.

Enfin, ce que je ne comprends pas c'est qu'un appel comme
sp1->load("sprite.bmp");
ne pose quand à lui aucun problème !!!
Que ce passe-t-il avec les constructeurs et destructeurs ?? Je suppose
que c'est en relation avec les espaces de nom ?!

Si vous avez une solution, merci.



Ce n'est peut être pas un problème de "C++" mais plutôt de linker, je pense.
Est ce que tes Stuff2D.cc et Sprite2D.cc sont bien compilés en une
librairie ? Est ce que tu spécifies bien à ton compilateur de lier ton
programme avec cette librairie ?

--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/

Avatar
Fabien LE LEZ
On 15 Nov 2003 16:57:39 GMT, Zouplaz wrote:

Sprite2D(void);
~Sprite2D(void);


Rien à voir avec ton problème, mais enlève le "void", ça fera plus
propre (et moins C).

--
;-)

Avatar
Zouplaz
Benoit Rousseau - :


Ce n'est peut être pas un problème de "C++" mais plutôt de linker, je
pense. Est ce que tes Stuff2D.cc et Sprite2D.cc sont bien compilés en
une librairie ? Est ce que tu spécifies bien à ton compilateur de lier
ton programme avec cette librairie ?



Exact, ne croyais que c'était lié à l'utilisation des namespace mais pas du
tout. C'est effectivement un problème avec le linker. Désolé !