【问题标题】:error: c++ [map] does not name a type错误:c++ [map] 没有命名类型
【发布时间】:2014-10-19 22:07:11
【问题描述】:

我在文本冒险游戏的文本命令解析器中编写了以下内容。

我正在尝试将用户输入的字符串与枚举类中的项目相关联。以下是我的头文件:

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

当我把它通过编译器时,我得到以下信息:

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

这是我第一次尝试使用地图和枚举,我不确定我做错了什么。我也不是非常熟悉自动变量的使用,所以这对我来说有点像货物崇拜编程。我希望我理解了它的实现,一旦我解决了我遇到的类型定义问题,错误就会消失。

编辑:这很尴尬。我复制粘贴了一个我已经更正的错误。代码仍然无法编译时(即发生相同问题时)

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

修正为

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

【问题讨论】:

  • 你必须把你的任务放在一个函数中。
  • 我已经用c++11编译器编译过了,是的。
  • Galik,我正在寻找一个例子来说明你的意思。您是否知道按照您描述的方式构建它的一个很好的例子?
  • 请参阅@Oncaphillis 的回答了解我的意思。这些行必须在函数内部。

标签: c++ parsing map enums


【解决方案1】:

您不能将非声明构造直接放在命名空间范围内。

C++ 翻译单元是一系列声明。

赋值等非声明语句必须在函数体内。


固定代码:

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

这里knownNouns初始化。这不是作业,即使 = 看起来很像作业。

【讨论】:

  • 是否有任何理由将您转换为尾随返回类型符号?
  • 是的。如果不积极引导并让人们熟悉它,我们就不会让人们以几乎同样快的速度采用这种符号。
  • 嗯,这是一个有价值的目标,尽管我个人会坚持只在它提供一些更切实的好处时使用它。
  • @BradleyEvans:按照编译器的建议添加选项 -std=c++11(告诉它这是 C++11 代码)。您可能还想添加-Wall-Wextra-pedantic-errors。 IIRC。 ;-) 请注意,此答案的固定代码中没有名称 Verb。所以这不是你正在编译的代码。
  • 这是一个迟到的回复,但我注意到这个问题正在获得意见。我想我会澄清一下,这确实解决了我当时的问题。
【解决方案2】:

您不能像这样静态初始化地图条目:

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

【讨论】:

    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    相关资源
    最近更新 更多