erreur: commutateur de la quantité et non un entier
J'ai recherché ma question sur StackOverflow et multi-liens google, et je suis encore confus. J'ai pensé que la meilleure chose pour moi est de demander...
Im la création d'une simple ligne de commande de la calculatrice. Voici mon code pour l'instant:
const std::string Calculator::SIN("sin");
const std::string Calculator::COS("cos");
const std::string Calculator::TAN("tan");
const std::string Calculator::LOG( "log" );
const std::string Calculator::LOG10( "log10" );
void Calculator::set_command( std::string cmd ) {
for(unsigned i = 0; i < cmd.length(); i++)
{
cmd[i] = tolower(cmd[i]);
}
command = cmd;
}
bool Calculator::is_legal_command() const {
switch(command)
{
case TAN:
case SIN:
case COS:
case LOG:
case LOG10:
return true;
break;
default:
return false;
break;
}
}
l'erreur que j'obtiens est:
Calculator.cpp: In member function 'bool Calculator::is_trig_command() const':
Calculator.cpp: error: switch quantity not an integer
Calculator.cpp: error: 'Calculator::TAN' cannot appear in a constant-expression
Calculator.cpp: error: 'Calculator::SIN' cannot appear in a constant-expression
Calculator.cpp: error: 'Calculator::COS' cannot appear in a constant-expression
Le puissant internet, il dit que les chaînes de caractères sont autorisés à être utilisés dans les instructions switch.
Merci à tous, je vous remercie de votre aide.
- Vous ne pouvez pas basculer sur un
string
en C++. stackoverflow.com/questions/650162/... - "Le puissant internet, il dit que les chaînes de caractères sont autorisés à être utilisés dans les instructions switch." Où?
- Le puissant internet peut dire que "les chaînes sont autorisées à être utilisées dans les instructions switch...en C#", mais jamais en C++.
- Mon erreur... majeure de l'échec de ma part. J'ai confondu avec C#...
Vous devez vous connecter pour publier un commentaire.
Dans
switch
, l'expression doit être de "un type intégral ou d'un type de classe pour lequel il existe une ambiguïté de conversion de type intégral" (citant VS2008 docs).Une classe string n'est pas dépourvu d'ambiguïté de conversion de type intégral", comme un
char
n'.Comme un travail autour de:
Créer un
map<string, int>
et le commutateur sur la valeur de la carte:switch(command_map[command])
`
Faire un jeu de
if
/else
au lieu de l'interrupteur. Beaucoup plus ennuyeux et difficile à lire, donc, je vous recommande la carte de l'itinéraire.Comme une parenthèse, une bien meilleure solution pour vraiment logique compliquée comme ça, c'est pour améliorer la cartographie solution pour se débarrasser de
switch
complètement et au lieu de cela aller avec une fonction de recherche de:std::map<std::string, functionPointerType>
. Il peut ne pas être nécessaire pour votre cas spécifique, mais est BEAUCOUP plus rapide pour se complique très longue recherche de la logique.Que les autres et le compilateur a commenté, les chaînes ne sont pas autorisées avec
switch
. Je voudrais juste utiliserif
Je ne pense pas que c'est plus compliqué, et c'est à peu près aussi vite qu'il pouvait obtenir. Vous pouvez également utiliser mon commutateur macro, pour la faire ressembler
(ayant
break
après unreturn
est du code mort, et devrait donc être évité).Chaînes ne peuvent pas être utilisés dans les instructions switch en C++. Vous aurez besoin de mettre en
if
/else if
, comme ceci:Plutôt que d'un interrupteur.
Je voudrais utiliser un modèle de commande. Puis d'utiliser un std::map de la carte le nom de la fonction de l'objet de commande.
Quelque chose comme ceci:
Pas sûr de puissants Internet vous ai lu, mais le C++ ne permet pas de chaînes dans
switch
consolidés. (C#, cependant).Vous avez besoin de convertir votre
switch
déclaration à une chaîne deif
-else if
-else
déclarations que le test d'égalité.L'erreur du compilateur vous dit tout ce que vous devez savoir. Seulement partie intégrante types peuvent être comparés dans les instructions switch.
Je ne suis pas sûr de la "mighty internet" vous dit le contraire, mais il était puissant mal.
Chaînes ne peuvent pas être utilisés comme des constantes dans les instructions switch en c++. Vous pouvez soit utiliser une carte, une série de si ou vous pouvez passer de la représentation de vos commandes comme des chaînes de caractères à un enum. Analyser à partir de la chaîne enum fois, puis utilisez un commutateur, comme vous le faites maintenant. Notez que votre traitement de chaîne peut exiger le même mécanisme (carte/si), mais en fonction de votre cas d'utilisation à l'aide d'une approche sur les autres peut améliorer la lisibilité. Je ne vais pas dire quoi que ce soit sur l'approche qui est plus lisible.