Partage
  • Partager sur Facebook
  • Partager sur Twitter

Visual Studio : Erreur C2675

Sujet résolu
    22 août 2022 à 12:27:06

    Bonjour,

    Je suis en ce moment  le cours de C++ sur https://zestedesavoir.com et je travaille sur un des TP proposés qui est de créer une discographie en ligne de commande selon le cahier des charges prescrit. Je vous laisse vous renseigner à cette adresse si vous souhaitez en savoir plus sur l'exercice : https://zestedesavoir.com/tutoriels/822/la-programmation-en-c-moderne/decoupons-tout-ca/t-p-un-gestionnaire-de-discographie/.

    Mon problème est que je n'arrive pas à déceler la provenance d'une erreur dans mon code, la C2675, car celle-ci apparaît à une ligne qui n'appartient pas à mon code mais à un des fichiers de la bibliothèque standard C++ j'imagine.

    Je sais aussi que l'erreur est lié à à la manipulation de l'opérateur "++", et que le compilateur ne sait pas quel type renvoyer en retour car cet opérateur n'a pas été surchargé pour cela. Or, je n'ai pas défini dans mon projet de nouveaux types ou de structures de données, je ne sais donc pas d'où pourrait provenir l'erreur. J'ai aussi essayé de supprimer individuellement chaque fonction du projet pour isoler la source de l'erreur mais sans succès..

    Voici l'erreur en question :

    Et voici le code source de mon projet :

    // Projet zeste de savoir remise à niveau.cpp : Ce fichier contient la fonction 'main'. L'exécution du programme commence et se termine à cet endroit.
    //
    
    #include <iostream>
    #include <string>
    #define NOMINAX
    #include <Windows.h>
    #include <cassert>
    #include <vector>
    #include <algorithm>
    #include <tuple>
    #include <unordered_map>
    #include <iomanip>
    #include <map>
    #include <set>
    #define COMMANDES {"quitter", "afficher", "ajouter", "charger", "enregistrer"}
    
    
    std::tuple<std::string, std::string> recuperer_commande()
    {
        std::string commande{};
        std::vector<std::string> const commandes_acceptes COMMANDES;
        bool mot_cle_valide{ false };
    
        while (true)
        {
            std::cout << "\n> ";
    
            std::getline(std::cin, commande);
    
            std::string const mot_cle{ begin(commande), find(begin(commande), end(commande), ' ') };
    
            for (std::string const& element : commandes_acceptes)
            {
                if (mot_cle == element)
                {
                    mot_cle_valide = true;
                    break;
                }
            }
    
            if (!mot_cle_valide)
            {
                std::cout << "\nErreur : commande invalide.";
                continue;
            }
            else
            {
                return { mot_cle, commande };
            }
        }
    }
    
    void help()
    {
        std::cout << "Voici la liste des commandes disponibles : \n";
        std::cout << "   \"ajouter\", vous permet d'ajouter un morceau à votre discographie, à utiliser avec 3 syntaxes différentes \n";
        std::cout << "       /--> ajouter morceau\n";
        std::cout << "       /--> ajouter morceau | album\n";
        std::cout << "       /--> ajouter morceau | album | artiste\n";
        std::cout << "       Vous pouvez egalement omettre une des 2 autres informations tel que :\n";
        std::cout << "       /--> ajouter morceau | | artiste\n";
        std::cout << "   \"afficher\", vous permet d'afficher la discographie actuellement en cours de manipulation de 3 manières différentes :\n";
        std::cout << "       /--> afficher morceaux\n";
        std::cout << "       /--> afficher albums\n";
        std::cout << "       /--> afficher artistes\n";
        std::cout << "   \"enregistrer\", vous permet d'enregistrer la discographie actuelle dans un fichier, tel que :\n";
        std::cout << "       /--> enregistrer nom_fichier\n";
        std::cout << "   \"charger\", vous permet de carger le contenu d'une discographie préalablement enregistrée dans une fichier tel que :\n";
        std::cout << "       /--> charger nom_fichier\n";
        std::cout << "   \"quitter\", vous permet de quitter le logiciel.";
    }
    
    
    void ajouter_morceau(std::map<std::string, std::map<std::string, std::set<std::string>>>& discographie, std::string const& morceau)
    {
        discographie["Artiste inconnu"]["Album inconnu"].insert(morceau);
    }
    
    void ajouter_morceau(std::map<std::string, std::map<std::string, std::set<std::string>>>& discographie, std::string morceau, std::string album)
    {
        if (discographie["Artiste inconnu"].find(album) != end(discographie["Artiste inconnu"]))
        {
            discographie["Artiste inconnu"][album].insert(morceau);
        }
        else
        {
            discographie["Artiste inconnu"].insert({ album, {morceau} });
        }
    }
    
    void ajouter_morceau(std::map<std::string, std::map<std::string, std::set<std::string>>>& discographie, std::string& morceau, std::string& album, std::string& artiste)
    {
        if (discographie.find(artiste) != end(discographie))
        {
            if (discographie[artiste].find(album) != end(discographie[artiste]))
            {
                if (discographie[artiste][album].find(morceau) != end(discographie[artiste][album]))
                {
                    std::cout << "\nCe Morceau existe déjà !";
                    return;
                }
                else
                {
                    discographie[artiste][album].insert(morceau);
                }
            }
            else
            {
                discographie[artiste].insert({ album, {morceau} });
            }
        }
        else
        {
            discographie.insert({ artiste, {album, {morceau}} });
        }
    }
    
    
    void ajouter(std::map<std::string, std::map<std::string, std::set<std::string>>>& discographie, std::string const& commande)
    {
        std::string premier_mot_cle{};
        auto const debut_commande{ std::begin(commande) };
        auto const fin_commande{ std::end(commande) };
        auto debut_morceau{ debut_commande };
    
        for (auto it{ std::find(debut_commande, fin_commande, ' ') + 1 }; it != std::end(commande); it++)
        {
            if (isspace(*it))
            {
                continue;
            }
            debut_morceau = it;
            break;
        }
    
        assert(debut_morceau != debut_commande && "Erreur à l'itérateur debut_morceau");
    
        auto fin_morceau{ debut_commande };
        std::string morceau{};
    
        if (std::find(debut_morceau, fin_commande, '|') == fin_commande)
        {
            fin_morceau = fin_commande;
    
            if (std::empty({ debut_morceau, fin_morceau }))
            {
                return;
            }
            else
            {
                morceau = { debut_morceau, fin_morceau };
                //ajouter_morceau(discographie, morceau);
                return;
            }
        }
    
        for (auto it{ debut_morceau }; it != fin_commande; it++)
        {
            if (isspace(*it) or *it == '|')
            {
                fin_morceau = it;
                break;
            }
        }
    
        morceau = { debut_morceau, fin_morceau };
    
        assert(fin_morceau != debut_commande && "Erreur à l'itérateur fin_morceau");
    
        auto debut_album{ debut_commande };
    
        for (auto it{ fin_morceau + 1 }; it != end(commande); it++)
        {
            if (isspace(*it) or *it == '|')
            {
                continue;
            }
            debut_album = it;
            break;
        }
    
        assert(debut_album != debut_commande && "Erreur à l'itérateur debut_album");
    
        auto fin_album{ debut_commande };
    
        std::string album{};
    
        if (find(debut_album, fin_commande, '|') == fin_commande)
        {
            fin_album = fin_commande;
    
            if (std::empty({ debut_album, fin_album }))
            {
                //ajouter_morceau(discographie, morceau);
                return;
            }
            else
            {
                album = { debut_album, fin_album };
                //ajouter_morceau(discographie, morceau, album);
                return;
            }
        }
    
        for (auto it{ debut_album }; it != fin_commande; it++)
        {
            if (isspace(*it) or *it == '|')
            {
                fin_album = it;
                break;
            }
        }
    
        album = { debut_album, fin_album };
    
        assert(fin_album != debut_commande && "Erreur à l'itérateur fin_album");
    
        auto debut_artiste{ debut_commande };
    
        for (auto it{ fin_album + 1 }; it != end(commande); it++)
        {
            if (isspace(*it) or *it == '|')
            {
                continue;
            }
            debut_artiste = it;
            break;
        }
    
        assert(debut_artiste != debut_commande && "Erreur à l'itérateur debut_artiste");
    
        auto fin_artiste{ debut_commande };
    
        auto const espace_fin{ find(debut_artiste, fin_commande, ' ') };
        auto const tabulation_fin{ find(debut_artiste, fin_commande, ' ') };
    
        if (espace_fin != fin_commande)
        {
            fin_artiste = espace_fin;
        }
        else if (tabulation_fin != fin_commande)
        {
            fin_artiste = tabulation_fin;
        }
        else
        {
            fin_artiste = fin_commande;
        }
    
        fin_album = fin_commande;
    
        if (std::empty({ debut_artiste, fin_artiste }))
        {
            //ajouter_morceau(discographie, morceau, album);
            return;
        }
        else
        {
            std::string const artiste{ debut_album, fin_album };
            //ajouter_morceau(discographie, morceau, album);
            return;
        }
    }
    
    
    int main()
    {
        SetConsoleOutputCP(1252); // Instruction pour afficher les caractères accentués sur la console de Windows
    
        std::cout << "Bienvenue dans ce logiciel de discographie. Ce dernier vous permet de répertorier des morceaux, des albums ou même des artistes dans votre discographie.";
        std::cout << "\nRentrez 'help' pour obtenir la liste des commandes disponibles.";
    
        std::map<std::string, std::map<std::string, std::set<std::string>>> discographie{ {"Artiste inconnu", {"Album inconnu", {"Morceau inconnu"}}} };
    
        while (true)
        {
            
            auto const [mot_cle, commande] = recuperer_commande();
            if (mot_cle == "help")
            {
                help();
            }
            else if (mot_cle == "ajouter")
            {
                ajouter(discographie, commande);
            }
            else if (mot_cle == "afficher")
            {
    
            }
            else if (mot_cle == "enregistrer")
            {
    
            }
            else if (mot_cle == "charger")
            {
    
            }
            else
            {
                return 0;
            }
        }
        return 0;
    }:

     Désolé, je n'ai pas documenté mon code, j'espère que vous y comprendrez tout de même quelque chose...

    Merci d'avance pour les réponses.

    -
    Edité par ValentinClementz 22 août 2022 à 12:29:42

    • Partager sur Facebook
    • Partager sur Twitter
      22 août 2022 à 13:00:55

      L'image du texte de l'erreur n'est pas visible.

      Pouvez-vous la donner au format "texte" ? (message d'erreur + ligne et nom du fichier en erreur)

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        22 août 2022 à 14:37:27

        Gravité    Code    Description    Projet    Fichier    Ligne    État de la suppression
        Erreur    C2675    '++' unaire : '_Iter' ne définit pas cet opérateur ou une conversion vers un type acceptable pour l'opérateur prédéfini    Debuggage TP    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\xtree    1278   
         

        Voici le nom de l'erreur telle qu'elle apparaît sur Visual Studio.

        Quand je double-clic sur l'erreur, une surcharge de la fonction "insert()" apparaît mais je n'arrive pas à comprendre son fonctionnement :/

        template <class _Iter>
            void insert(_Iter _First, _Iter _Last) {
                _Adl_verify_range(_First, _Last);
                auto _UFirst       = _Get_unwrapped(_First);
                const auto _ULast  = _Get_unwrapped(_Last);
                const auto _Myhead = _Get_scary()->_Myhead;
                for (; _UFirst != _ULast; ++_UFirst) {
                    _Emplace_hint(_Myhead, *_UFirst);
                }
            }



        -
        Edité par ValentinClementz 22 août 2022 à 14:42:57

        • Partager sur Facebook
        • Partager sur Twitter
          22 août 2022 à 15:57:31

          Ce que tu indiques n'est que le début de l'erreur.
          Il doit y avoir après le texte qui continue avec des lignes telles que :
          "l'erreur a eu lieu pendant l'interprétation de : ...." qui ramène à celui qui a appelé la fonction insert()
          et d'autre lignes similaires pour finir sur une ligne de ton code.

          Donc en gros il faut lire la première ligne (on ne peut pas incrémenter l'itérateur parce que ça n'est pas un itérateur ou parce qu'il est constant!)
          Puis lire la dernière ligne qui doit passer des itérateurs à une fonction de la STL. Il nous faut cette ligne.

          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            22 août 2022 à 16:00:39

            Ligne 274, il manque des accolades :

                std::map<std::string, std::map<std::string, std::set<std::string>>>
                      discographie {{"Artiste inconnu", {{"Album inconnu", {"Morceau inconnu"}}}}};

            Idem ligne 115 :

                    discographie.insert( {{artiste, {{album, {morceau}}}}} );




            • Partager sur Facebook
            • Partager sur Twitter
            ...
              23 août 2022 à 18:16:11

              Merci beaucoup pour vos réponses, effectivement c'était l'oubli d'accolades aux lignes 274 et 115 qui posait problème, après quelques autres modifications le code compile à nouveau et je peux continuer à avancer dans l'exercice.

              @Dafalb, J'utilise l'IDE Visual Studio 2017, et je ne vois pas vraiment qu'est-ce que tu attends comme informations supplémentaires. Quand je clique dessus ou que je la copie, je n'ai pas plus d'informations sur l'erreur. Il y a sûrement quelque chose que je n'ai pas bien saisi dans la gestion des erreurs, donc si tu pouvais m'expliquer davantage ce que tu attendais de moi j'en serai reconnaissant.

              • Partager sur Facebook
              • Partager sur Twitter
                23 août 2022 à 18:33:23

                Ce que vous donnez ressemble furieusement à ce "qu'affiche" la fenêtre "Liste d'erreurs" et non ce qui est affiché dans la fenêtre "Sortie" (en sélectionnant "Build" dans la "commandToolbar" de cette fenêtre) qui elle contient vraiment la sortie d'erreur du compilateur, du linker, etc...

                La fenêtre "Liste d'erreurs" n'affiche qu'un résumé des erreurs.

                • Partager sur Facebook
                • Partager sur Twitter
                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                Visual Studio : Erreur C2675

                × 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