C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

utilisation de string

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Laurent B
Guest





PostPosted: Wed Jan 26, 2005 10:25 am    Post subject: utilisation de string Reply with quote



bonjour j'ai un petit pb avec STRING.
voila mon .h :


#ifndef _LISTECONTACT_
#define _LISTECONTACT_
#include "contact.h"
#include <string>


using namespace std;

class ListeContact {

private:
Contact * Pt_debut;

public:
void CreerListe (Contact *debut);
void SupprimerListe(ListeContact uneListe);
void AjouterContact (Contact unContact) ;
void ModifierContact(Contact *unContact);
void SupprimerContact();
void TrierContact();
void recherche(string c_nom,string c_prenom,string c_cp,string
c_ville,string c_tel,string c_fonction);
};


#endif /* _LISDTECONTACT_ */


voila mon .cpp :

#include "stdio.h"
#include <stdlib.h>
#include <string>
#include <iostream>
#include "listecontact.h"
#include "contact.h"



using namespace std;

....

void recherche(string c_nom,string c_prenom,string c_cp,string
c_ville,string c_tel,string c_fonction)
{
cout << " bonjour";
system("PAUSE");
}
;

#include "contact.h"
#include "listecontact.h"
#include #include <string>


void main ()
{
ListeContact l ;
l.recherche("e","e","e","e","e","e");
cout << "bonjour";
cout << endl ;
system ("PAUSE");
}



qd je lance g 2 pb :

--------------------Configuration: carnet - Win32 Debug--------------------
Compiling...
test.cpp
Linking...
test.obj : error LNK2001: unresolved external symbol "public: void
__thiscall ListeContact::recherche(class std::basic_string std::char_traits,class
std::basic_string<char,struct std::char_traits class std::allocator<char> >,class std::basic_string<char,struct
std::char_traits,class
std::basic_string<char,struct std::char_traits std::allocator<char> >,class std::basic_string<char,struct std::cha
r_traits,class
std::basic_string<char,struct std::char_traits std::allocator<char> >)"
(?recherche@ListeContact@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@00000@Z)
Debug/carnet.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

carnet.exe - 2 error(s), 0 warning(s)


Donc voila, vous ne pensez quoi ? ca peut venir d'ou ?

Laurent



Back to top
fabrizio
Guest





PostPosted: Wed Jan 26, 2005 10:32 am    Post subject: Re: utilisation de string Reply with quote



Quote:
void recherche(string c_nom,string c_prenom,string c_cp,string
c_ville,string c_tel,string c_fonction)

non non non Smile
void ListeContact::recherche(string c_nom, ...

comme tu l'avais fait recherche était défini dans l'espace de nom std.
donc quand tu fais :
l.recherche il ne trouve effectivement pas de fonction de ce nom.


Back to top
Stanislas RENAN
Guest





PostPosted: Wed Jan 26, 2005 3:19 pm    Post subject: Re: utilisation de string Reply with quote



Bonjour,

fabrizio a écrit :

Quote:
void recherche(string c_nom,string c_prenom,string c_cp,string
c_ville,string c_tel,string c_fonction)


non non non Smile
void ListeContact::recherche(string c_nom, ...

comme tu l'avais fait recherche était défini dans l'espace de nom std.
tu dis ça parce qu'il a écrit :

"using namespace std;" ?

Pour moi, comme il n'a pas défini de namespace englobant, il est au
niveau le plus élevé (global), et définit donc ::recherche() et non pas
std::recherche().

la directive using permet d'importer les noms, et ne déplace pas le
code des lignes suivant ladite directive dans le contexte en paramètre
de la directive.

Pour définir std::recherche(), j'aurais écrit :
namespace std
{
void recherche() {}
}

Je ne sais pas si on a le droit d'étendre ce namespace std sans
encourir la colère divine du grand normalisateur Smile
--
Stanislas RENAN

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Thu Jan 27, 2005 7:50 am    Post subject: Re: utilisation de string Reply with quote

Laurent B wrote:
Quote:
bonjour j'ai un petit pb avec STRING.

Pas avec std::string, mais avec quelque conceptes de base du
C++. Il y a aussi des détails que je me permettrais à signaler.

Quote:
voila mon .h :

#ifndef _LISTECONTACT_
#define _LISTECONTACT_

Des noms qui commence par un _, suivi d'une majuscule, sont
réservés à l'implémentation. Tu n'as pas droit à les définir.

Quote:
#include "contact.h"
#include <string

using namespace std;

C'est en général pas un très bonne idée de faire un « using
namespace » à la portée globale dans un en-tête. Si vraiment tu
y tiens, mets-le dans la classe. (Personnellement, en ce qui me
concerne, le nom de la classe est std::string ; c'est donc comme
ça que je l'écris. Mais les avis sont partagés sur cette
politique, tandis que tous les expertes, je crois, s'accorde
pour condamner le « using namespace » à la portée globale dans
un en-tête.)

Quote:
class ListeContact {

private:
Contact * Pt_debut;

public:
void CreerListe (Contact *debut);
void SupprimerListe(ListeContact uneListe);
void AjouterContact (Contact unContact) ;
void ModifierContact(Contact *unContact);
void SupprimerContact();
void TrierContact();
void recherche(string c_nom,string c_prenom,string c_cp,string
c_ville,string c_tel,string c_fonction);

Tu déclares ici une fonction membre de ListeContacte.

Quote:
};

#endif /* _LISDTECONTACT_ */

voila mon .cpp :

#include "stdio.h"
#include #include #include #include "listecontact.h"
#include "contact.h"

using namespace std;

...

void recherche(string c_nom,string c_prenom,string c_cp,string

Et ici, tu définis une fonction libre du nom recherche. Ce n'est
pas du tout la fonction que tu as déclarée.

Sans doute, ce que tu veux, c'est :

! void ListeContact::recherche...

Quote:
c_ville,string c_tel,string c_fonction)
{
cout << " bonjour";
system("PAUSE");
}
;

Ici, c'est encore un troisième fichier (aussi un .cpp) je suppose.

Quote:
#include "contact.h"
#include "listecontact.h"
#include #include

void main ()

Formellement, c'est « int main() ». Certaines implémentations
permettent « void main() » comme une extention, mais d'autres
non. Toutes acceptent « int main() ».

Quote:
{
ListeContact l ;
l.recherche("e","e","e","e","e","e");

Ici, tu appelles ListeContact::recherche. La fonction que tu
n'as pas défini.

Quote:
cout << "bonjour";
cout << endl ;
system ("PAUSE");
}

qd je lance g 2 pb :

--------------------Configuration: carnet - Win32
Debug--------------------
Compiling...
test.cpp
Linking...
test.obj : error LNK2001: unresolved external symbol "public: void
__thiscall ListeContact::recherche(class
std::basic_string std::char_traits,class
std::basic_string<char,struct std::char_traits class std::allocator<char> >,class std::basic_string<char,struct
std::char_traits,class
std::basic_string<char,struct std::char_traits std::allocator<char> >,class std::basic_string<char,struct std::cha
r_traits,class
std::basic_string<char,struct std::char_traits std::allocator<char> >)"

(?recherche@ListeContact@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@00000@Z)
Debug/carnet.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

Et ce message d'erreur n'est pas assez clair ? L'externe non
résolu, c'est bien ListeContact::recherche. Et tu n'as nulle
part une définition d'une fonction de ce nom.

Ceci dit, si tu ne sais pas encore définir des fonctions membre,
je te conseille un bon livre ou un cour de C++ avant d'aller
plus loin. Parce qu'il s'agit vraiment d'un des b a ba de C++.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Thu Jan 27, 2005 7:55 am    Post subject: Re: utilisation de string Reply with quote

fabrizio wrote:
Quote:
void recherche(string c_nom,string c_prenom,string
c_cp,string c_ville,string c_tel,string c_fonction)

non non non Smile
void ListeContact::recherche(string c_nom, ...

comme tu l'avais fait recherche était défini dans l'espace de
nom std. donc quand tu fais : l.recherche il ne trouve
effectivement pas de fonction de ce nom.

Ne confondons pas les choses. D'abord, comme il l'a écrit, il a
déclaré une fonction membre ::ListeContact::recherche, mais il a
défini une fonction libre ::recherche. Toutes les deux dans la
portée globale, c-à-d l'espace référentiel ::. Une fonction
membre n'est pas une fonction libre, une classe n'est pas un
espace référentiel, et il n'a rien défini ni déclaré dans
l'espace référentiel std (ce qui serait illégal, à quelques
menus exceptions près).

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Thu Jan 27, 2005 7:57 am    Post subject: Re: utilisation de string Reply with quote

Stanislas RENAN wrote:

Quote:
Je ne sais pas si on a le droit d'étendre ce namespace std
sans encourir la colère divine du grand normalisateur Smile

C'est selon. Il y a quelques cas particuliers où c'est permis ;
la spécialisation d'une classe templatée standard sur un type
défini par l'utilisateur me vient à l'esprit, mais pour les
non-experts, la formulation simple de la règle est que c'est
interdit.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
drkm
Guest





PostPosted: Thu Jan 27, 2005 12:03 pm    Post subject: Re: utilisation de string Reply with quote

[email]kanze (AT) gabi-soft (DOT) fr[/email] writes:

Quote:
il n'a rien défini ni déclaré dans
l'espace référentiel std (ce qui serait illégal, à quelques
menus exceptions près).

Je pensais que la seule chose permise était la spécialisation de
modèles de std:: sur des types utilisateurs. À quoi penses-tu ?

--drkm

Back to top
Falk Tannhäuser
Guest





PostPosted: Thu Jan 27, 2005 6:14 pm    Post subject: Re: utilisation de string Reply with quote

[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:

Quote:
Stanislas RENAN wrote:
Je ne sais pas si on a le droit d'étendre ce namespace std
sans encourir la colère divine du grand normalisateur :)

C'est selon. Il y a quelques cas particuliers où c'est permis ;
la spécialisation d'une classe templatée standard sur un type
défini par l'utilisateur me vient à l'esprit

Si je comprends bien § 17.4.3.1/1, "A program may add template
specializations for any standard library template to namespace
std ...", cette spécialisation est aussi permise pour les
fonctions templatées sous certaines conditions - par exemple,
on devrait pouvoir faire ceci :

class MaClasse
{
...
public:
void swap(MaClasse&);
};

namespace std
{
template<> void swap(MaClasse& a, MaClasse& b)
{ a.swap(b); }
}

ce qui permet d'appeler le bon swap() lorsqu'on instancie
un template faisant appel à std::swap() avec MaClasse.

Falk


Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Fri Jan 28, 2005 8:52 am    Post subject: Re: utilisation de string Reply with quote

Falk Tannhäuser wrote:
Quote:
kanze (AT) gabi-soft (DOT) fr wrote:

Stanislas RENAN wrote:
Je ne sais pas si on a le droit d'étendre ce namespace std
sans encourir la colère divine du grand normalisateur :)

C'est selon. Il y a quelques cas particuliers où c'est
permis ; la spécialisation d'une classe templatée standard
sur un type défini par l'utilisateur me vient à l'esprit

Si je comprends bien § 17.4.3.1/1, "A program may add template
specializations for any standard library template to namespace
std ...", cette spécialisation est aussi permise pour les
fonctions templatées sous certaines conditions

Toute à fait. Je ne cherchais pas à être exhaustif, ni même très
précis ; j'ai juste cité la première chose qui m'est venu à
l'esprit.

Quote:
- par exemple, on devrait pouvoir faire ceci :

class MaClasse
{
...
public:
void swap(MaClasse&);
};

namespace std
{
template<> void swap(MaClasse& a, MaClasse& b)
{ a.swap(b); }
}

ce qui permet d'appeler le bon swap() lorsqu'on instancie un
template faisant appel à std::swap() avec MaClasse.

Je dirais que c'est probablement le cas le plus courant où on
serait amené à définir quelque chose soi-même dans std.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Fri Jan 28, 2005 8:54 am    Post subject: Re: utilisation de string Reply with quote

drkm wrote:
Quote:
kanze (AT) gabi-soft (DOT) fr writes:

il n'a rien défini ni déclaré dans
l'espace référentiel std (ce qui serait illégal, à quelques
menus exceptions près).

Je pensais que la seule chose permise était la
spécialisation de modèles de std:: sur des types utilisateurs.
À quoi penses-tu ?

C'est à ça, précisement, que je pensais. Mais je ne me mettrai
pas la main au feu qu'il n'y a pas d'autre exception cachée
quelque part dans un coin.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
drkm
Guest





PostPosted: Fri Jan 28, 2005 12:27 pm    Post subject: Re: utilisation de string Reply with quote

[email]kanze (AT) gabi-soft (DOT) fr[/email] writes:

Quote:
Mais je ne me mettrai
pas la main au feu qu'il n'y a pas d'autre exception cachée
quelque part dans un coin.

C'est rarement une bonne idée lorsque l'on parle de la norme.

--drkm

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.