He escrito el siguiente como parte de un comando de texto analizador de texto de un juego de aventura.

Estoy tratando de asociar una cadena de entrada por parte de un usuario a un elemento de una clase enum. El siguiente es en mi archivo de encabezado:

#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;

Cuando pongo esto a través del compilador, me sale lo siguiente:

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;
            ^

Esta es mi primera vez tratando de utilizar los mapas y las enumeraciones, y no estoy seguro de qué es lo que me hizo mal. Tampoco estoy terriblemente familiarizado con el uso de auto vars, así que un poco de carga-culto a la programación de mi parte. Tengo la esperanza de comprender su aplicación y el error se borrará una vez que resolver la definición del tipo de problema que estoy teniendo.

edit: Que verguenza. He copiado y pegado de un error que ya había corregido. el código no compila cuando (es decir, el mismo problema se produce cuando)

map < string, Noun > knownNouns;
knownNouns["name"]      = Verb::name;
knownNouns["base"]      = Verb::base;
knownNouns["attack"]    = Verb::attack;

es corregido como

map < string, Noun > knownNouns;
knownNouns["name"]      = Noun::name;
knownNouns["base"]      = Noun::base;
knownNouns["attack"]    = Noun::attack;
Usted tiene que poner sus asignaciones dentro de una función.
He compilado en c++11 compilador, sí.
Galik, estoy buscando un ejemplo de lo que significa. Existe una posibilidad de que usted sabe de un buen ejemplo de la construcción de la manera que usted describe?
Ver a @Oncaphillis la respuesta para lo que quiero decir. Las líneas tienen que estar dentro de una función.

OriginalEl autor Bradley Evans | 2014-10-19

2 Comentarios

  1. 15

    Usted no puede colocar la no declaración de las construcciones directamente en el ámbito de espacio de nombres.

    C++ unidad de traducción es una secuencia de declaraciones.

    La no declaración de afirmaciones como las tareas deben estar dentro de la función de los órganos.


    Código fijo:

    #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 = 
    {
        { "name", Noun::name },
        { "base", Noun::base },
        { "attack", Noun::attack }
    };
    
    auto parseNoun( string const& noun )
        -> Noun
    {
        //auto n = knownNouns.find(noun);
        //if ( n == knownNouns.end() ) {
            //return Noun::invalid;
        //}
        //return n->second;
        return Noun::invalid;
    }

    Aquí knownNouns es inicializado. No es una tarea, incluso si el = se parece mucho a una asignación.

    ¿Hay alguna razón para su transformación a trailing-retorno-tipo de notación?
    Sí. No vamos a conseguir que la gente adopte la notación casi igual de rápido si no activamente para mostrar el camino y que las personas se familiaricen con ella.
    Bueno, esa es una meta que vale la pena, aunque yo personalmente voy a palo a sólo el uso de la misma, donde se proporciona más beneficios tangibles.
    añadir opción de -std=c++11 como el compilador sugiere (diciendo es que esto es C++11 código). puede que también desee agregar -Wall, -Wextra y -pedantic-errors. Si mal no recuerdo. 😉 Tenga en cuenta que no hay ningún nombre Verb en el código fijo en esta respuesta. Así que no es el código que se está compilando.
    Esta es una respuesta tardía a esto, pero me di cuenta de que esta pregunta fue conseguir que los puntos de vista. He pensado que me gustaría aclarar que este hecho solucionar mi problema en el momento.

    OriginalEl autor Cheers and hth. – Alf

  2. 3

    Usted no puede inicializar entradas de mapa de forma estática como:

     knownNouns["name"]      = Verb::name;
     knownNouns["base"]      = Verb::base;
     knownNouns["attack"]    = Verb::attack;

    OriginalEl autor Oncaphillis

Dejar respuesta

Please enter your comment!
Please enter your name here