erreur: c++ [carte] n'est pas le nom d'un type de
J'ai écrit ce qui suit dans le cadre d'un texte de commande de l'analyseur pour un jeu d'aventure texte.
Je suis d'essayer d'associer une chaîne de caractères entrée par un utilisateur à un élément dans un enum classe. La suite est dans mon fichier d'en-tête:
#include <iostream>
#include <map>
#include <string>
using namespace std;
enum class Noun
{
//Interrogation subjects
name, //ask the subject his name
base, //where is the base?
attack, //when will the attack be?
invalid
};
map < string, Noun > knownNouns;
knownNouns["name"] = Noun::name;
knownNouns["base"] = Noun::base;
knownNouns["attack"] = Noun::attack;
Noun parseNoun(string &noun)
{
auto n = knownNouns.find(noun);
if ( n == knownNouns.end() ) {
return Noun::invalid;
}
return n->second;
Quand j'ai mis cela par le compilateur, je reçois le texte suivant:
nouns.h:46:1: error: 'knownNouns' does not name a type
knownNouns["name"] = Noun::name;
^
nouns.h:47:1: error: 'knownNouns' does not name a type
knownNouns["base"] = Noun::base;
^
nouns.h:48:1: error: 'knownNouns' does not name a type
knownNouns["attack"] = Noun::attack;
^
nouns.h: In function 'Noun parseNoun(std::string&)':
nouns.h:52:10: error: 'n' does not name a type
auto n = knownNouns.find(noun);
^
nouns.h:53:10: error: 'n' was not declared in this scope
if ( n == knownNouns.end() ) {
^
nouns.h:54:16: error: 'Noun' is not a class or namespace
return Noun::invalid;
^
nouns.h:56:12: error: 'n' was not declared in this scope
return n->second;
^
C'est ma première fois d'essayer d'utiliser les cartes et les énumérations, et je ne suis pas sûr de ce que je fait de mal. Je suis également pas terriblement familier avec l'utilisation de l'auto de vars, de sorte que c'est un peu de la cargaison-culte de la programmation de ma part. J'espère que j'ai compris sa mise en œuvre et l'erreur s'effacer une fois que j'résoudre la définition de type de problème, je vais avoir.
edit: C'est gênant. J'ai copier collé une erreur que j'avais déjà corrigé. le code ne compile pas quand (c'est à dire, le même problème se produit lorsque)
map < string, Noun > knownNouns;
knownNouns["name"] = Verb::name;
knownNouns["base"] = Verb::base;
knownNouns["attack"] = Verb::attack;
est corrigée comme
map < string, Noun > knownNouns;
knownNouns["name"] = Noun::name;
knownNouns["base"] = Noun::base;
knownNouns["attack"] = Noun::attack;
J'ai compilé en c++11 compilateur, oui.
Galik, je suis à la recherche d'un exemple de ce que tu veux dire. Est-il une possibilité que vous connaissez un bon exemple de construction dans le chemin que vous avez décrit?
Voir @Oncaphillis réponse à ce que je veux dire. Ces lignes doivent être à l'intérieur d'une fonction.
OriginalL'auteur Bradley Evans | 2014-10-19
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas placer de non-déclaration de constructions directement dans l'espace de noms portée.
C++ de l'unité de traduction est une séquence de déclarations.
Non-déclaration des instructions telles que les travaux doivent être à l'intérieur de la fonction des organes.
Code fixe:
Ici
knownNouns
est initialisé. Ce n'est pas une cession, même si le=
ressemble beaucoup à une cession.Oui. Nous n'aborderons pas les gens à adopter la notation presque aussi vite si ce n'est pas activement montrer la voie et de familiariser les gens avec elle.
Eh bien, c'est un objectif louable, mais je vais personnellement restez uniquement à l'aide de l'endroit où il fournit encore plus d'avantages tangibles.
ajout de l'option
-std=c++11
que le compilateur suggère (le fait de dire que c'est le C++11 du code). vous pouvez également ajouter-Wall
,-Wextra
et-pedantic-errors
. IIRC. 😉 A noter qu'il n'y a pas de nomVerb
dans le code fixe dans cette réponse. Ce n'est donc pas le code à la compilation.C'est une réponse tardive à cela, mais j'ai remarqué que cette question a été prise en vue. J'ai pensé que je voudrais vous préciser que cela n'a en effet résoudre mon problème à l'époque.
OriginalL'auteur Cheers and hth. - Alf
Vous ne pouvez pas initialiser la carte les entrées de manière statique comme:
OriginalL'auteur Oncaphillis