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
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
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.
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.
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.
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.
En recherche d'emploi.