【问题标题】:Unknown type name error when inserting into unordered_map插入 unordered_map 时出现未知类型名称错误
【发布时间】:2021-12-15 18:47:41
【问题描述】:

我有一个名为 main.cpp 的文件,我试图在其中声明一个 unordered_map,如下所示。

std::unordered_map<std::string, std::set<int>> firstSets;

然后我尝试将一个新的(键,值)对插入到映射中,如下所示。

std::string decl = "decl";
std::set<int> declFirstSet = {VOID_TOK, INT_TOK, FLOAT_TOK, BOOL_TOK};
firstSets[decl] = declFirstSet;

当我这样做时,我得到以下编译器错误。

C++ 需要所有声明的类型说明符

firstSets[decl] = declFirstSet;

数组的大小具有非整数类型“std::string”(又名“basic_string”)

firstSets[decl] = declFirstSet;

所以当我实际上想要插入它时,它似乎认为我在声明“firstSets”。它似乎将“firstSets”视为一个数组而不是unordered_map。我该如何解决这个问题?

【问题讨论】:

  • 这些声明/表达式是否在全局范围内(函数之外)?
  • 是的。 @1201ProgramAlarm
  • 把insert放在main里面就可以了
  • 你不能在全局范围内有表达式。 firstSets[decl] = declFirstSet; 需要在函数内部。您也可以在定义它时使用构造函数对其进行初始化。
  • 好的,谢谢。为什么不能在全局范围内使用表达式?

标签: c++ compiler-errors unordered-map


【解决方案1】:

您的std::make_pair 错误。为了更接近您需要std::set&lt;int&gt; 而不是std::set

但你真正想要的是让编译器为你做它:

    firstSets.insert(std::make_pair(decl, declFirstSet));

或使用更简单的语法:

    firstSets[decl] = declFirstSet;

了解问题后进行编辑 另一方面,您希望 firstSets 带有初始内容,您可以重新排序声明:

#include <set>
#include <string>
#include <unordered_map>

std::string decl{"decl"};
std::set<int> declFirstSet{1, 2, 3, 4};
std::unordered_map<std::string, std::set<int>> firstSets{{decl, declFirstSet}};

int main() {}

【讨论】:

  • 我已编辑我的问题以反映您建议的更改。 @Bo R
  • 我对你的代码的测试看起来像这样#include &lt;set&gt; #include &lt;string&gt; #include &lt;unordered_map&gt; int main() { std::unordered_map&lt;std::string, std::set&lt;int&gt;&gt; firstSets; std::string decl = "decl"; std::set&lt;int&gt; declFirstSet = {1, 2, 3, 4}; firstSets[decl] = declFirstSet; } 因为你没有显示所有代码,所以问题很可能早在涉及VOID_TOK 和其他值的宏的源代码中,或者缺少标题。很难说。
  • 我的代码不在主函数中,它在全局范围内。我将更新以显示更详细的代码。 @Bo R
  • @TomFinet,我知道问题所在。您不能在函数之外的范围内拥有表达式。因此,firstSets[decl] = declFirstSet; 被编译器尝试作为声明(它不是)。拥有void somefunctionname() { firstSets[decl] = declFirstSet; } 是您能做的最好的事情。
  • “更简单”的语法有不同的语义。如果他认为它们做完全相同的事情,那可能会导致细微的错误......
【解决方案2】:

我不知道为什么它不起作用,但你不需要调用 make_pair... 将插入行更改为:

firstSets.insert({decl, declFirstSet});

应该可以解决你的问题。

这是一个完整的代码示例:

#include <set>
#include<string>
#include <unordered_map>
using namespace std;
int main()
{
    std::unordered_map<std::string, std::set<int>> firstSets;
    set<int> s = { 1, 2, 3 };
    firstSets.insert({ "key", s });   
}

但您似乎希望它们在全局范围内声明,因此您将像以下代码一样进行初始化:

#include <set>
#include<string>
#include <unordered_map>
using namespace std;

set<int> s1 = { 1, 2, 3 }, s2 = { 4, 5, 6 };
std::unordered_map<std::string, std::set<int>> firstSets{ {"key1", s1}, {"key2", s2}};
int main()
{
}

【讨论】:

  • 错误仍然存​​在。它仍然说:“未知类型名称'firstSets'”和“不能在类型上使用点运算符”。 @vmp
  • @vmp,您必须在示例中包含&lt;string&gt;
  • 哦,是的...visual studio 似乎将它添加到引擎盖下,会解决这个问题!
猜你喜欢
  • 2012-02-20
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多