Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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