débutant : question technique sur transtypage
	
	
		Bonjour,
je suis débutant et ai écrit le programme suivant (j'ai laissé les parties de code qui nous intéressent) :
	Code:
	
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 
 | #include <cstdlib>
#include <iostream>
#include <string.h>
 
using namespace std;
/****************** class chaine ****************
*************************************************/
class chaine
{
      public:
             chaine(const char* _val);
      private:
              int longueur;
              char* val;
};
 
chaine::chaine(const char* _val)
{
    longueur=strlen(_val);
    val=new char[longueur+1];
    strcpy(val,_val);
}
 
 
/********************* class pile-chaine **************
*******************************************************/
class pile_chaine
{
      public:
 
          int empiler(const chaine& chn);
          pile_chaine& operator=(const pile_chaine& op2);
      private:
          int max;
          enum pile_etat{ok,plein,vide};
          chaine* table;
          int nb_elem;
          pile_etat etat;
};
 
 
 
int pile_chaine::empiler(const chaine& chn)
{}
 
 
int main(int argc, char *argv[])
{
    pile_chaine tab_chaine(5);
    tab_chaine.empiler("test1");
    system("PAUSE");
    return EXIT_SUCCESS;
} | 
 Ce programme accepte le transtypage dans le programme principal, c'est à dire que "tab_chaine.empiler("test1") fonctionne et l'argument formel "const chaine& chn" de "int pile_chaine::empiler" s'initialise grace au constructeur de transtypage défini au début.
J'ai essayé avec une modification suivante (je note ici uniquement les lignes où j'ai changé quelque chose) :
	Code:
	
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | class pile_chaine
{
      public:
 
          int empiler(chaine& chn);
      private:
          ..........
};
 
 
 
int pile_chaine::empiler(chaine& chn)
{}
int main(int argc, char *argv[])
{
    pile_chaine tab_chaine(5);
    tab_chaine.empiler("test1");
    .............
} | 
 le seul changement que j'ai fait est de remplacer l'argument constant formel ("const chaine& chn") de "int pile_chaine::empiler" en un argument non constant ("chaine& chn") et à la compilation j'ai l'erreur suivante : 
	Code:
	
| 12
 
 | 169 C:\Dev-Cpp\programme1-main.cpp no matching function for call to `pile_chaine::empiler(const char[6])' 
 note C:\Dev-Cpp\programme1-main.cpp:114 candidates are: int pile_chaine::empiler(chaine&) | 
 Est-ce que quelqu'un peut m'expliquer pourquoi le transtypage ne fonctionne plus. Merci d'avance.
                              Xavier
	 
	
	
	
		réponse : (débutant : question technique sur le transtypage)
	
	
		Merci LAURENT et MAT,
je saisis mieux ce que vous voulez dire. je considère que c'est résolu.:D 
Une précision concernant MAT :
	Citation:
	
		
		
			void f( std::string& ) {}
 
int main( int, char*[] )
{
  f( std::string() );
  return 0;
}
			
		
	
 Dans cet exemple que tu me donnes, "std::string&" représente t-il bien une référence sur une chaine de caractère (je n'ai pas le standard C++, mais je crois que string désigne une chaine dans le standard). Et est-ce que "std::string()" représente l'appel d'une fonction (qui renverrai une référence sur une chaine de caractère) ?
Si j'ai bien saisi "std::string()" renverrai une référence sur une chaine de caractère qui n'est pas nommée, donc "à la volée". Ceci nécessite donc qu'on déclare l'argument "const std::string&" dans f. Est-ce que j'ai bien saisi ?
Question pour LAURENT et MAT : j'ai 2 ouvrages de C++ : 1 assez concis et 1 de 1200 pages. Je croyais que ce dernier était complet, mais je me suis apperçu qu'il manquait des choses (par exemple il n'y a rien sur les types string qui désignerait des chaines de caractère dans le standard ou il n'y a rien des explications que vous m'avez donné pour mon problème de cette discussion). Ma question est la suivante : connaissez vous un ouvrage (en français si possible) très très complet qui reprenne le standard du C++ et qui aborde le maximum des spécificités du C++ et qui soit de bonne qualité pour les explications (avec exercices corrigés si possible)?
Merci de votre réponse. A bientôt.
	 
	
	
	
		réponse (débutant : question technique sur le transtypage)
	
	
		Merci LAURENT, MAT et LUC de vos explications et interventions.
                             Xavier:D