Incompatibilité 'std' et 'friend'

Signaler
Messages postés
1
Date d'inscription
samedi 29 mars 2003
Statut
Membre
Dernière intervention
29 mars 2003
-
Messages postés
455
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
6 avril 2004
-
CABECOU

J'ai définit une fonction amie, celle ci doit donc pouvoir accéder aux champs
privée de la classe. Ceci marche trés bien sauf quand la classe utilise la
bibliotheque standard. Des que j'écris "using namespace std" pour utiliser la
bibliotheque standard alors le compilateur ne veut plus accéder aux champs
privées, ni protégées ne la classe .

--> exemple :

//essai.h
#include
#include <string>

using namespace std ;

class essai {

friend ::ostream& operator<<( ::ostream & , const essai & );

public :

essai( int para1=0 , int para2=0 , const char * para3 = "caca" )
:A(para1) , B(para2) , ch(para3) {} ;

//.....

private : //ou protected --> le problème est le même

int A ,
B ;
string ch ;
};

//essai.cpp
#include "essai.h"

::ostream & operator<<( ::ostream & os , const essai & E )
{
os << E.A << E.B << E.ch.c_str() ;

return os ;
}

--> compilateur : 'A' : cannot access private member declared in class 'essai' ===> ainsi que pour B et ch

//test_essai.cpp
#include "essai.h"

int main ( void )
{

essai E ;

cout<<E ;

return (0);

}

--> le compilateur m'écrit

...merci de me répondre, c assez pressant

1 réponse

Messages postés
455
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
6 avril 2004
8
bonjour

si c'est pressé....
je pense que tu compile avec VisualC++6, il est connu pour mal se comporter dans ce cas là.
Ne pas mélanger les includes avec et sans .h !
transforme ton en
ou alors, s'il est possible de te priver de la classe string, inclure le string.h à la place du string

pas de problème avec le code suivant :
//essai.h
#include
#include <string>
class essai {
friend std::ostream& operator<<( std::ostream & , const essai & );
public :
essai( int para1= 0 , int para2=0 , const char * para3 = "caca" )
:A(para1) , B(para2) , ch(para3) {} ;
private :
int A , B ;
std::string ch ;
};

//essai.cpp
//#include "essai.h"

std::ostream & operator<<( std::ostream & os , const essai & E )
{
os << E.A << E.B << E.ch.c_str() ;
return os ;
}

//test_essai.cpp
//#include "essai.h"
int main ( void )
{
essai E ;
std::cout << E ;
return (0);
}