Partage
  • Partager sur Facebook
  • Partager sur Twitter

enum class "is not a class or a namespace"

Sujet résolu
    9 novembre 2019 à 13:16:03

    Bien le bonjour,

    j'ai remarqué que beaucoup de monde avait ce problème et qu'il n'était jamais résolu:

    voici mon problème,j'ai créé une enum class nommée Classe :

    personnage.h :

    #ifndef PERSONNAGE_H_INCLUDED
    #define PERSONNAGE_H_INCLUDED
    
    #include <SFML/Graphics.hpp>
    #include <SFML/Network.hpp>
    #include <cstdlib>
    #include <cmath>
    #include <iostream>
    #include <vector>
    
    enum class Classe : sf::Uint16 {
        none = 0,
        mage,
        invocateur,
        epeiste,
    };
    
    class Personnage {
    public:
        void init();
    private:
        sf::Uint16 argent;
        Classe classe;
    };
    
    #endif // PERSONNAGE_H_INCLUDED
    

    personnage.cpp :

    #include "personnage.h"
    
    void Personnage::init() {
        argent = 0;
        classe = Classe::none;//le problème se trouve ici !
    }
    




    Lors de la compilation, le problème "Classe is not a class or a namespace" fait son apparition.

    Je ne comprends pas s'il vous plaît aidez-moi !

    • Partager sur Facebook
    • Partager sur Twitter

    La programmation, c'est l'art d'exprimer sa créativité !

      9 novembre 2019 à 13:30:26

      Lu'!

      Ton compilateur est bien configuré au minimum en C++11 ?

      Quelques commentaires :

      • le rôle d'initialisation, c'est le rôle du constructeur, donc pas de fonction "init" dans une classe,
      • on met le minimum vital d'inclusions dans un header, il est préférable de déplacer une bonne partie de tes include dans le fichier cpp.
      • Partager sur Facebook
      • Partager sur Twitter

      Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

        9 novembre 2019 à 18:27:09

        Comment vérifit on et comment on peut configuré en c++11 ?

        Je suis sur code::blocks.

        Merci pour ta réponse d'ailleurs.:lol:

        • Partager sur Facebook
        • Partager sur Twitter

        La programmation, c'est l'art d'exprimer sa créativité !

          12 novembre 2019 à 11:13:48

          Salut,

          Tu devrais peut-être jetter un coup d'oeil à ce post

          Sinon il parait étrange de donner des précisions sur la valeur dans un enum class (le typer avec sf::Uint16 et l'indexer à 0) quand le but de l'enum class est de renforcer le typage de l'enum pour éviter les traitements utilisant la valeur sous-jacente. Pourquoi as-tu eu besoin de les renseigner ?

          3 petites remarques :

           - enlève la virgule à la fin de la dernière valeur de l'enum, le compilateur le gère mais ce n'est pas la syntaxe originale

           - préfère l'anglais dans le code, typiquement à cause des mots comme "épéïste" qui ont des caractère spéciaux interdits. là ça va mais des fois ça peut devenir vraiment moche

           - l'include de <cstdlib> ne présage rien de bon, pourquoi en as tu besoin ?

          • Partager sur Facebook
          • Partager sur Twitter
          Dream on, Dream on, Dream until your dream comes true
            12 novembre 2019 à 15:43:52

            Dans ce cas précis je ne sais pas, mais il n'y a rien de bizarre à affecter des valeurs dans l'enum class. On peut vouloir le check du compilo et manipuler les valeurs sous jacentes (moyennant un static_cast ou une classe pour faire du bitmask à partir de l'enum class). Par exemple l'abstraction C++ de Vulkan en fait une utilisation intensive.
            • Partager sur Facebook
            • Partager sur Twitter
              12 novembre 2019 à 16:21:14

              J'ai pas été catégorique parce qu'il y a peut-être des utilisations que je ne vois pas, mais si j'utilise les valeurs sous-jacentes de mon enum, pourquoi je voudrais que le compilo m'engeule quand je le transtype implicitement ? les valeurs ont été choisies, le transtypage doit pouvoir se faire naturellement. Du coup quand j'affecte des valeurs, pour reprendre l'exemple, pour faire des flags, j'utilise des enums simple.

              Du coup j'étais un peu curieux, j'ai jeté un rapide coup d'oeil à vulkan (donc je suis peut-être passé à côté), j'ai l'impression que c'est surtout des associations pour faciliter l'interface à la lib écrite en C, ça me parait être une bonne raison effectivement, mais c'est à cause du binding, il n'y aura pas de traitement qui utilise la valeur dans la partie C++ de Vulkan.

              • Partager sur Facebook
              • Partager sur Twitter
              Dream on, Dream on, Dream until your dream comes true
                12 novembre 2019 à 20:48:19

                En fait, je veux faire un RPG avec la SFML et je voudrais faire un système de classes(mage, guerrier, invocateur etc...), l'enum servait juste à structurer le code, ou plutôt à utiliser le nom de la classe(mage, guerrier , ...) plutôt qu'un chiffre car il y a un risque qu'on ne sache plus quel classe appartient à quelle valeur, j'aurais pu utiliser les string mais je préfère les nombres entiers.

                Merci pour vos messages, c'est sympa.

                Comme je fais un rpg j'ai besoin d'un tuto pas mal pour apprendre à faire des dessins en pixels(personnages, décors ou autres choses comme des monstres), si quelqu'un en connait un ce serait sympa qu'il me le montre.Même si ça n'a rien à voir avec le sujet du topic, désolé.Ne fermez pas le topic svp!:'(

                PS: en plus je suis gentil !:ange:

                -
                Edité par AymericSt 12 novembre 2019 à 20:49:34

                • Partager sur Facebook
                • Partager sur Twitter

                La programmation, c'est l'art d'exprimer sa créativité !

                  13 novembre 2019 à 9:32:05

                  L'orienté objet ne va pas très bien avec les RPG ni les jeux en général. Exemple simple :

                  • une classe cheval
                  • une classe oiseau

                  Comment faire un « cheval - oiseau » ? Certains vont penser à l'héritage multiple, c'est crade et inadapté. Ton enum est simple mais elle va vite te limiter dans tes possibilités.

                  Je te conseille d'utiliser un pattern ECS ou chaque personnage de ton jeu ne sera pas une classe précise mais un ensemble de compositions formant un tout. Le but est de constituer des petites parties sémantiques à une entité afin d'en former un tout complex et évolutif.

                  Avec ceci, on peut imaginer faire une entité en lui ajoutant des composants comme :

                  • vol (l'entité peut voler)
                  • invisibilité
                  • magie (l'entité peut utiliser de la magie)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  git is great because Linus did it, mercurial is better because he didn't.

                    13 novembre 2019 à 12:07:15

                    Je n'ai fait que quelques tests, je ne l'ai pas mis réellement en situation, mais je trouve la lib entt, qui implémente l'ECS, très sexy ;)

                    Pour le dessin, j'aime bien le logiciel krita, mais vu que je ne suis pas un artiste, je me sers plus de ressources du net (ici ou ), au mieux tu trouves ce que tu cherches, au pire ça sers de placeholder jusqu'à que tu aies quelque chose de plus abouti dans ton concept du jeu pour que tu puisse enfin te consacrer à la DA.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Dream on, Dream on, Dream until your dream comes true
                      13 novembre 2019 à 13:25:03

                      +1 pour entt dont le développeur est assez sympa aussi.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      git is great because Linus did it, mercurial is better because he didn't.

                        13 novembre 2019 à 17:33:03

                        Haha oui, j'avais pas remarqué ta contribution :)

                        Merci pour ça <3

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Dream on, Dream on, Dream until your dream comes true
                          13 novembre 2019 à 19:06:19

                          Merci pour le conseil sur l'ECS ! Le problème c'est que mon ide : code::blocks n'est pas mis à jour en c++17, je n'ai pas Cmake ni Doxygen qui sont indispensables à entt. Désolé d'en demander trop mais j'aimerai que qelqu'un m'explique comment faire pour avoir c++17, Cmake v.3.2 et Doxygen v.1.8.(Et aussi entt parce que je ne sais pas quels fichiers installer sur github).ça fait beaucoup, si on ne m'aide pas je serai malheureusement obligé de continuer avec mes méthodes actuelles.

                          Et désolé je ne cherche pas de logiciel de dessin, je recherche un tuto dessin pixel si quelqu'un en connait un.

                          Je sais bien que je demande vraiment beaucoup de choses et j'en suis désolé(vraiment).>_<

                          -
                          Edité par AymericSt 13 novembre 2019 à 19:59:12

                          • Partager sur Facebook
                          • Partager sur Twitter

                          La programmation, c'est l'art d'exprimer sa créativité !

                            14 novembre 2019 à 9:08:29

                            Tu n'as pas besoin de CMake car entt c'est un seul et unique en-tête. Il y a juste à le mettre dans le répertoire de ton projet. Pour le C++17, met à jour ton compilateur ou passe à un vrai IDE moderne et installe CMake.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            git is great because Linus did it, mercurial is better because he didn't.

                              14 novembre 2019 à 12:32:33

                              CMake est un moteur de production, qui permet de paramétrer notamment la chaine de compilation dans un projet C++

                              Docygen est un outil de documentation, il lit le code et les annotation formatées et les mets en forme dans un document, un page web par exemple

                              Ces outils ne sont pas indispensable à entt, c'est juste si tu veux extraire la documentation t'utilise doxygen et dans ses programmes de tests le développeur a utilisé CMake donc si tu veux les rejouer sans les reconfigurer, tu utilise CMake.

                              Pour les avoir t'as juste à aller sur leurs site respectifs

                              Je ne crois pas que Code::Blocks ait une intégration de CMake, par contre CMake peut générer un fichier de projet Code::Blocks

                              Par contre le C++17 est effectivement requis, il faut mettre à jour le compilateur (ce qu'on t'as déjà conseillé au début du post)

                              Mais donc tu cherches un tuto de quel logiciel ?

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Dream on, Dream on, Dream until your dream comes true
                                14 novembre 2019 à 20:09:35

                                Comment met on a jour code::blocks en c++17 ?Si et seulement si c'est impossible quel compilateur me conseillez vous ?:)

                                Et le tuto que je cherche c'est juste un tuto dessin pixel avec n'importe quel logiciel de dessin, c'est pour apprendre à bien faire ses personnages, monstres ou décors.

                                -
                                Edité par AymericSt 14 novembre 2019 à 20:13:23

                                • Partager sur Facebook
                                • Partager sur Twitter

                                La programmation, c'est l'art d'exprimer sa créativité !

                                  15 novembre 2019 à 10:54:22

                                  Code::Blocks n'est pas un compilateur. Généralement il embarque MinGW, et le principe est donc juste d'installer une version à jour de MinGW et de le filer à manger à Code::Blocks.

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

                                    15 novembre 2019 à 15:58:29

                                    Ah oui désolé, je le savais mais j'ai dit n'importe quoi car je pensais que vous comprendriez quand même.

                                    Je reformule donc ma question : où pouvons nous trouver mingW version c++17(si possible en 32 bits).

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    La programmation, c'est l'art d'exprimer sa créativité !

                                      15 novembre 2019 à 16:49:00

                                      Salut,

                                      AymericS1 a écrit:

                                      Ah oui désolé, je le savais mais j'ai dit n'importe quoi car je pensais que vous comprendriez quand même.

                                      Je reformule donc ma question : où pouvons nous trouver mingW version c++17(si possible en 32 bits).


                                      Sur la forge de MinGW-w64, directement (il faut savoir que MinGW-w64 a complètement remplacé le projet MinGW -- sans -w64 -- car il était impossible d'ajouter, en l'état, le support du 64 bits au projet d'origine) ;).

                                      Si tu regarde bien, il y a une ligne "MinGW-w64 online installer".  C'est le plus facile à utiliser, car, une fois que tu l'as téléchargé, il va te permettre de choisir selon les différentes versions disponibles.

                                      Choisi de préférence la version la plus récente (8.1.0), dans la "saveur" qui t'intéresse ;)

                                      Juste une petite question: pourquoi tiens tu absolument à ce que ce soit un compilateur 32 bits?  Cela fait bien quinze ans que tous les PC vendus présentent une architecture 64 bits, et, sauf erreur de ma part, windows est disponible en version 64 bits au moins depuis la version Vista!!!

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                                        15 novembre 2019 à 19:51:58

                                        c'est parce que je n'étais pas sur d'avoir la bonne version de mon ide pour supporter le 64bits

                                        J'ai réussi à installer mingw sur mon ide, j'ai réussi à compiler mon programme après avoir changé les "toolchains executables" dans settings->compiler...->toolchains executables de mon ide mais je ne sais pas comment inclure la bibliothèque standard dans mon ide, pourrai tu éclairer ma lanterne ?

                                        -
                                        Edité par AymericSt 15 novembre 2019 à 20:37:26

                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        La programmation, c'est l'art d'exprimer sa créativité !

                                          17 novembre 2019 à 9:40:14

                                          AymericS1 a écrit:

                                          c'est parce que je n'étais pas sur d'avoir la bonne version de mon ide pour supporter le 64bits

                                          Attention, un IDE, tu dois le comparer à un éditeur de texte évolué, dans le sens où il fournit "tout ce qu'il faut" (du moins, en théorie) pour pouvoir gérer ton projet, à savoir:

                                          • un éditeur de texte
                                          • de quoi fournir la configuration de ton projet (indiquer les fichiers, s'il faut créer une bibliothèque ou une application, indiquer les options à transmettre aux différents outils, ...)
                                          • de quoi invoquer et manipuler aisément les autres outils, à savoir:
                                            • le compilateur,
                                            • l'éditeur de liens,
                                            • le créateur d'archive
                                            • le débugger
                                          • de quoi "faire le lien" entre les différents outils (ex: quand tu as une erreur de compilation, ce qui te permet de retrouver la ligne du fichier qui pose problème rien qu'en cliquant sur l'erreur)
                                          • de quoi représenter la sortie de certains outils (comme le débuggeur) sous une forme lisible et compréhensible.

                                          Il ne fait donc que te faciliter la vie en automatisant ce que tu pourrais parfaitement faire en ligne de commande (surtout depuis que CMake existe pour configurer les projets); et, de manière générale, si programme (comme le compilateur ou le débuggeur) peut tourner sur ta machine, l'EDI est capable de l'utiliser ;)

                                          AymericS1 a écrit:

                                          j'ai réussi à compiler mon programme

                                          Et il n'y a pas eu d'erreurs, que ce soit de compilation ou d'édition de liens ?

                                          Cela indique sans l'ombre d'un doute que la configuration donnée à ton IDE était la bonne ;)

                                          AymericS1 a écrit:

                                          je ne sais pas comment inclure la bibliothèque standard dans mon ide, pourrai tu éclairer ma lanterne ?

                                          Si tu as bien configuré ton IDE pour utiliser g++ pour compiler ton code C++, tu n'as rien à faire: sa configuration par défaut est prévue pour que la bibliothèque standard soit automatiquement utilisée (en fournissant "par défaut" le chemin d'accès vers les fichiers d'en-tête et vers l'endroit où se trouve les différentes bibliothèques, ainsi qu'en indiquant à l'éditeur de liens qu'il doit utiliser libstdc++ par défaut).

                                          C'est si tu essaye d'utiliser gcc que tu risques d'avoir un problème, car ce n'est qu'un "front end" (comprend: un outil "de facade", adapté à la compilation de plusieurs langages), qui ne connait aucun des paramètres spécifiques qui doivent être utilisés pour les différents langages (et donc, pour C++).  Et, du coup, il faut les transmettre de manière explicites ;)

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                                            17 novembre 2019 à 10:21:26

                                            J'ai quand même un problème au niveau de la bibliothèque standard, car je ne peux pas l'utiliser, j'ai des erreurs de type "undefined reference to std::cout".

                                            Désolé d'avoir encore besoin d'aide mais c'est bientôt fini.:honte:

                                            Voici les settings de mon compilateur et du debugger:

                                            Dans compiler flag j'ai coché : have g++ follow the coming c++1z(aka c++17) ISO language standard.

                                            Dans toolchains executables:

                                            c compiler: i686-w64-mingw32-gcc.exe

                                            c++ compiler: i686-w64-mingw32-g++.exe

                                            linker for dynamic libs: i686-w64-mingw32-gcc-8.1.0.exe

                                            linker for static libs: ar.exe

                                            debugger: GDB/CDB debugger:default

                                            ressource compiler: windres.exe

                                            make program: mingw32-make.exe

                                            Dans debugger j'ai coché les 4 premières cases.

                                            -
                                            Edité par AymericSt 17 novembre 2019 à 10:32:09

                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            La programmation, c'est l'art d'exprimer sa créativité !

                                              17 novembre 2019 à 18:21:24

                                              Sauf erreur de ma part (parce que cela fait un petit temps que je n'utilise plus Code::Blocks), tu devrais sélectionner:

                                              •  le nom "sans fioritures" pour les deux compilateur (gcc.exe et g++.exe)
                                              • le nom du compilateur C++ (donc: g++.exe) pour l'éditeur de lien dynamique

                                              Il me semble que cela avait été clairement indiqué dans la discussion épeinglée du forum ;)

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                                                19 novembre 2019 à 18:52:26

                                                Merci à tous pour  vos réponses, je déclare donc le sujet résolu. :soleil:

                                                Voici l'exemple de code d'entt sur github que j'ai un peu modifié:

                                                #include "entt.hpp"
                                                #include <iostream>
                                                
                                                struct position {
                                                    float x;
                                                    float y;
                                                };
                                                
                                                struct velocity {
                                                    float dx;
                                                    float dy;
                                                };
                                                
                                                void updatePosition(entt::registry &registry, auto &player) {
                                                    auto view = registry.view<position, velocity>();
                                                
                                                    for(auto player: view) {
                                                        // gets only the components that are going to be used ...
                                                        auto &pos = view.get<position>(player);
                                                        auto &vel = view.get<velocity>(player);
                                                
                                                        pos.x += vel.dx;
                                                        pos.y += vel.dy;
                                                    }
                                                }
                                                
                                                int main() {
                                                    entt::registry registry;
                                                
                                                    auto player = registry.create();
                                                
                                                    registry.assign<position>(player, 0.f, 0.f);
                                                    registry.assign<velocity>(player, 1.f, 1.f);
                                                    auto view = registry.view<position, velocity>();
                                                    auto &pos = view.get<position>(player);
                                                    updatePosition(registry, player);
                                                    std::cout<< pos.x <<pos.y;
                                                }
                                                

                                                Dîtes moi si c'est bien ou pas(en tout cas le code marche).:ange:

                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                La programmation, c'est l'art d'exprimer sa créativité !

                                                  20 novembre 2019 à 2:40:35

                                                  Heuu, pourquoi transmet tu player en paramètre (alors qu'il ne sert à rien en plus)???

                                                  Tu devrais, à tout le moins, avoir un avertissement selon lequel ta variable player déclarée dans ta boucle cache le paramètre transmis, non?

                                                  Et, si j'étais toi, je cacherais le registry.assign<> dans différentes fonctions (createPosition(id, x, y) et createVelocity(id, dx, dy), car l'utilisateur n'a aucun besoin de savoir que c'est ton registry qui fait "tout le sale boulot" :D.

                                                  Et je ferais sans doute pareil avec les vues.  Au final, l'utilisateur pourrais donc avoir un code pour la fonction main ressemblant à

                                                  int main(){
                                                      entt::registry registry;
                                                      /* appel à registry create en sous main */
                                                      auto player = createEntity();
                                                      /* appel à registry.assign en sous main */
                                                      createPosition(id, 0., 0.);
                                                      createVelocity(id, 1., 1.);
                                                      /* appel à view.get en sous main */
                                                      auto & pos = positionOf(id);
                                                      auto & velocity = velocityOf(id);
                                                      /* a priori, updatePosition va traiter tous ls
                                                       * élément qui ont dispose d'une position et d'une
                                                       * vitesse... Registry suffit amplement à cela 
                                                       */
                                                      updatePositions(registry); // position est au pluriel 
                                                      /* ... */
                                                  }
                                                      



                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                                                    22 novembre 2019 à 20:41:25

                                                    Merci pour l'explication ! pourrais-tu me montrer un exemple de code où il y std::cout qui écrit la pos.x et pos.y parce que je n'y arrive pas, tout n'est pas encore très clair pour moi avec entt, même si j'ai jeté un coup d'oeil à l'explication sur github(le fichier "entity.md").

                                                    Merci de votre aide à tous pour aider les gens qui sont complètement paumés.:p

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    La programmation, c'est l'art d'exprimer sa créativité !

                                                    enum class "is not a class or a namespace"

                                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                    • Editeur
                                                    • Markdown