Pages : 1
#1 Le 12/07/2020, à 14:15
- chris7522
Template C++
Bonjour a toutes et a tous ,
J'ai copié collé ce code sur le site que j'étudie , pour m'apercevoir qu'il y a l'air d'avoir une erreur de portée.
Voici le code :
#include <iostream>
#include <limits>
template <typename T, typename Predicat>
void entree_securisee(T & variable, Predicat predicat)
{
while (!(std::cin >> jour) || !predicat(variable))
{
if (std::cin.eof())
{
throw std::runtime_error("Le flux a été fermé !");
}
else if (std::cin.fail())
{
std::cout << "Entrée invalide. Recommence." << std::endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
else
{
std::cout << "Le prédicat n'est pas respecté !" << std::endl;
}
}
}
int main()
{
int jour { 0 };
std::cout << "Quel jour es-tu né ? ";
entree_securisee(jour, [](int jour) -> bool { return jour > 0 && jour <= 31; });
int mois { 0 };
std::cout << "Quel mois ? ";
entree_securisee(mois, [](int mois) -> bool { return mois > 0 && mois <= 12; });
int annee { 0 };
std::cout << "Quelle année ? ";
entree_securisee(annee, [](int annee) -> bool { return annee > 1900; });
double taille { 0.0 };
std::cout << "Quelle taille ? ";
entree_securisee(taille, [](double taille) -> bool { return taille > 0.0; });
std::cout << "Tu es né le " << jour << "/" << mois << "/" << annee << " et tu mesures " << taille << "m." << std::endl;
return 0;
}
chris@chris:~/Bureau/Essai$ g++ essai18.cpp -o essai18C
essai18.cpp: In function ‘void entree_securisee(T&)’:
essai18.cpp:7:26: error: ‘jour’ was not declared in this scope
while (!(std::cin >> jour))
^~~~
essai18.cpp: In function ‘void entree_securisee(T&, Predicat)’:
essai18.cpp:29:26: error: ‘jour’ was not declared in this scope
while (!(std::cin >> jour) || !predicat(variable))
^~~~
chris@chris:~/Bureau/Essai$
Que devrai je faire pour arranger ca ?
Hors ligne
#2 Le 12/07/2020, à 14:21
- NicoApi73
Re : Template C++
Bonjour,
Ce n'est pas jour mais variable à utiliser dans la fonction :
while (!(std::cin >> variable) || !predicat(variable))
Hors ligne
#3 Le 12/07/2020, à 14:31
- chris7522
Re : Template C++
Ok merci . Je suis étonné que l'auteur ai pu faire ce genre d'erreur .
Sinon un petit point qui n'est pas parfaitement clair . L'instruction :
while (!(std::cin >> variable))
Cela équivaut a dire " tant que tu ne rentres pas de variable " ou plutot " tant que tu ne rentres pas une variable de type int en l'occurence " ?
Hors ligne
#4 Le 12/07/2020, à 14:50
- NicoApi73
Re : Template C++
Il rentre dans la boucle while (le contenu) si une erreur survient. D'ailleurs je pense que si eof intervient tu rentres dans une boucle infinie...
Hors ligne
#5 Le 12/07/2020, à 14:58
- chris7522
Re : Template C++
Ok , mais quellle genre d'erreur peut le faire entrer dans la boucle ? (dans notre exemple)
Hors ligne
#6 Le 12/07/2020, à 15:38
- NicoApi73
Re : Template C++
Il entre dans le corps de la boucle dès qu'un flag est monté, comme une saisie incorrecte. Il sort de la boucle dès que tout est correct. Donc si tu rentres les bons paramètres, tu ne rentres jamais dans le corps de la boucle.
cin est bloquant, il attend une saisie.
Hors ligne
#7 Le 14/07/2020, à 12:44
- chris7522
Re : Template C++
Ok merci pour tes explications !
Hors ligne
Pages : 1