IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[deb]message d'erreur const un declared in this scope


Sujet :

C++

  1. #1
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Points : 245
    Points
    245
    Par défaut [deb]message d'erreur const un declared in this scope
    Bonjour,

    j'ai un probleme avec un message d'erreur apres une decl. de constante avant une classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #include <iostream>
     
    using namespace std;
     
    int const max=10;
     // maximum=10
    //template <class X>
    class vecteur
    &#123;
    private&#58;
    int taille;
    int t&#91;max&#93;;
     
    public&#58;
    vecteur&#40;&#41;;
     
    vecteur&#40;int t&#41;;

    Et j'ai chaque fois ce message d'erreur avec Dev-Cpp 4.9.9

    In file included from test.cpp:2:
    vecteur.h:19: error: `max' was not declared in this scope

    make.exe: *** [test.o] Error 1

    Exécution terminée
    Pourtant il devrait venir avec les includes ou on doit le declare plusieur fois

    D'avance merci pour l'aide

    Marc_3

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    essaie
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Points : 245
    Points
    245
    Par défaut
    Pareil pas de progres avec le mes d'erreur

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut Re: [deb]message d'erreur const un declared in this scope
    Le coupable estqui importe le template std::max dans le namespace global avec pour resultat de rendre ambigues les deux declarations. Le message d'erreur de g++ depuis 3.4 n'est pas tres bon. Il etait meilleur avec la version 3.2.2
    foo.cpp:12: use of `max' is ambiguous
    foo.cpp:4: first declared as `const int max' here
    /opt/gcc-3.2.2/include/c++/3.2.2/bits/stl_algobase.h:207: also declared as `std::max' here
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Points : 245
    Points
    245
    Par défaut
    Bon voila mais ca ne m'avance pas je comprend toujours rien

  6. #6
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 394
    Points : 591
    Points
    591
    Par défaut
    Citation Envoyé par Marc_3
    Bon voila mais ca ne m'avance pas je comprend toujours rien
    il y a ambiguïté entre max et std::max, c'est à dire que le compilateur ne sait pas lequel des 2 il faut utiliser. Renomme ta constante ou alors marque "::max" quand tu veux utiliser la constante.

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Marc_3
    Bon voila mais ca ne m'avance pas je comprend toujours rien
    Tu inclus indirectement l'entete <algorithm> qui definit un template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <typename T> T max&#40;T const&, T const&&#41;;
    Quand tu faistu importes cette definition dans le namespace global.

    Ensuite tu donnes une definition de max dans le namespace global. On peut trouver etrange que ce soit autorise car il y a deja une definition (celle importee de std; si j'ai bonne memoire g++ 2.95 aurait rale), mais il me semble que ce l'est bien.

    Ensuite quand tu tentes d'utiliser max, il y a une ambiguite entre les deux definitions que le compilateur n'est pas capable de resoudre en respectant les regles du C++. Donc il se plains. Le message n'est pas particulierement bon, mais c'est la vie...

    Solutions:
    * arreter d'utiliser using namespace et qualifier correctement les noms
    * remplacer max par un identificateur qui n'est pas defini dans std:: (tu les connais tous? moi pas, c'est pourquoi je prefere la premiere solution).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par jmv
    "::max" quand tu veux utiliser la constante.
    Ca fonctionnera pas, la clause using a importe la definition de std dans le namespace global.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  9. #9
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 394
    Points : 591
    Points
    591
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Citation Envoyé par jmv
    "::max" quand tu veux utiliser la constante.
    Ca fonctionnera pas, la clause using a importe la definition de std dans le namespace global.
    je viens d'essayer sur visual.net, ça marche. [EDIT] avec DEV-C++ aussi [/EDIT]
    Je ne connais pas suffisament la norme pour savoir si c'est normal.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Y'a une solution encore plus simple, ecrire les constantes en CAPITALES, comme c'est le cas dans beaucoup de normes de programmation.

  11. #11
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Points : 245
    Points
    245
    Par défaut
    evidement si j'avais su je l'auari pas posee. Comme dit le mot est reserve quelque part et juste le renomage de la const de max a maxi a suffit.

    Et pourtant j'etais sur que cela etait encore ma faute

    Merci pour le soutien



    marc_3

  12. #12
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Points : 245
    Points
    245
    Par défaut
    Pour ce qui est du role de using namespace std;
    il va aussi falloir que je m'informe mais j'ai peur qu'il y aie encore beaucoup pour moi a apprendre avec Cpp avant ca

  13. #13
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par jmv
    Citation Envoyé par Jean-Marc.Bourguet
    Citation Envoyé par jmv
    "::max" quand tu veux utiliser la constante.
    Ca fonctionnera pas, la clause using a importe la definition de std dans le namespace global.
    je viens d'essayer sur visual.net, ça marche. [EDIT] avec DEV-C++ aussi [/EDIT]
    Je ne connais pas suffisament la norme pour savoir si c'est normal.
    Et como, sparcworks aussi. Bon ce doit etre moi qui ait un probleme dans ma comprehension de la recherche des noms... Quand j'aurais le temps j'irai voir ce qu'il en est precisement.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  14. #14
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par VoidSeer
    Y'a une solution encore plus simple, ecrire les constantes en CAPITALES, comme c'est le cas dans beaucoup de normes de programmation.
    Pas le meilleur choix. Je prefere reserver l'utilisation des capitales aux macros comme ca ce fait aussi beaucoup. Les macros ne respectant pas les portees, il est encore plus facile d'avoir des clash entre des macros et des identificateurs qui n'en sont pas.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  15. #15
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Quand j'aurais le temps j'irai voir ce qu'il en est precisement.
    Effectivement, lors de la recherche d'un nom qualifié (ce qu'est ::max), les directives using sont ignorées dans les namespaces qui contiennent une définition de ce nom; ce n'est pas le cas lors de la recherche de noms non qualifiés.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  16. #16
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Citation Envoyé par VoidSeer
    Y'a une solution encore plus simple, ecrire les constantes en CAPITALES, comme c'est le cas dans beaucoup de normes de programmation.
    Pas le meilleur choix. Je prefere reserver l'utilisation des capitales aux macros comme ca ce fait aussi beaucoup. Les macros ne respectant pas les portees, il est encore plus facile d'avoir des clash entre des macros et des identificateurs qui n'en sont pas.
    Il y en a qui mettent un _ avant la variable ( _max ). C'est pas mal aussi non?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  17. #17
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pas mieux, non. Le préfixage par 1 ou 2 underscores est reservé aux implémentation de la SL.

    Par contre ce qui se fait très bien c'est le suffixage par un underscore, mais typiquement c'est utilisé pour les variables membres.

  18. #18
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Loulou24
    Pas mieux, non. Le préfixage par 1 ou 2 underscores est reservé aux implémentation de la SL.
    Les règles sont un plus complexes que ça mais je retiens que les identificateurs
    * préfixés par un underscore
    * contenant (au moins) deux underscores consécutifs
    sont réservés pour l'implémentation (et pas uniquement la SL, l'implémentation peut en faire des mots clés -- __int32 par exemple -- ou ce qu'elle veut -- utiliser deux underscores consécutifs pour la décoration des noms de sorte qu'avoir un tel identificateur risque d'entrer en conflit avec un autre identificateur par exemple).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Citation Envoyé par VoidSeer
    Y'a une solution encore plus simple, ecrire les constantes en CAPITALES, comme c'est le cas dans beaucoup de normes de programmation.
    Pas le meilleur choix. Je prefere reserver l'utilisation des capitales aux macros comme ca ce fait aussi beaucoup. Les macros ne respectant pas les portees, il est encore plus facile d'avoir des clash entre des macros et des identificateurs qui n'en sont pas.

    Ah mais je bannis les macros.
    D'ailleurs, je bannis les variables globales aussi.

  20. #20
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par VoidSeer
    Ah mais je bannis les macros.
    D'ailleurs, je bannis les variables globales aussi.
    Et tu es en situation d'imposer ca a tout le code que tu utilises? Pas moi. Et je doute que quiconque puisse le faire dans le genre de projets pour lequel je travaille.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. QLabel et erreur "ui was not declared in this scope"
    Par sosdouble dans le forum Débuter
    Réponses: 1
    Dernier message: 24/04/2012, 20h42
  2. Erreur : "was not declared in this scope"
    Par Neirbo dans le forum Débuter
    Réponses: 4
    Dernier message: 22/02/2010, 13h55
  3. QFormLayout was not declared in this scope
    Par kronos85 dans le forum Débuter
    Réponses: 5
    Dernier message: 11/12/2008, 03h30
  4. message d'erreur avec la declaration d'une variable
    Par safezahra dans le forum VB.NET
    Réponses: 3
    Dernier message: 13/06/2008, 01h48
  5. Réponses: 3
    Dernier message: 03/06/2007, 16h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo