You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向unordered_map插入元素时报Unknown type name错误如何解决

报错原因

你的firstSets[decl] = declFirstSet;赋值语句写在了全局作用域中。C++语法规定,全局作用域仅允许出现声明类语句(变量声明、函数声明等),不支持直接编写赋值、函数调用这类执行语句。编译器无法识别这是对已有unordered_map的下标赋值操作,误将其解析为新数组firstSets的声明语句,因此抛出了类型说明符缺失、数组大小为非整数类型的错误。

解决方案

你可以根据实际场景选择以下任意一种修复方式:

  • 方案1:将赋值逻辑移到函数内部(最常用)
    把插入操作放到main函数或者自定义的初始化函数中即可符合语法要求,示例代码:
#include <unordered_map>
#include <string>
#include <set>

// 全局作用域仅保留变量声明
std::unordered_map<std::string, std::set<int>> firstSets;

int main() {
    // 函数内部执行赋值操作
    std::string decl = "decl";
    std::set<int> declFirstSet = {VOID_TOK, INT_TOK, FLOAT_TOK, BOOL_TOK};
    firstSets[decl] = declFirstSet;

    // 其余业务逻辑
    return 0;
}
  • 方案2:声明时直接用初始化列表赋值
    如果不需要后续动态修改初始内容,可以在声明map的时候直接完成初始化,适合初始化内容固定的场景:
// 全局作用域声明时直接初始化,符合语法规则
std::unordered_map<std::string, std::set<int>> firstSets = {
    {"decl", {VOID_TOK, INT_TOK, FLOAT_TOK, BOOL_TOK}}
};
  • 方案3:lambda立即调用初始化(C++17及以上版本支持)
    如果全局初始化逻辑比较复杂,可以用lambda立即执行的方式完成初始化:
std::unordered_map<std::string, std::set<int>> firstSets = [](){
    std::unordered_map<std::string, std::set<int>> tmp;
    std::string decl = "decl";
    std::set<int> declFirstSet = {VOID_TOK, INT_TOK, FLOAT_TOK, BOOL_TOK};
    tmp[decl] = declFirstSet;
    // 可在此处添加更多初始化逻辑
    return tmp;
}();

内容的提问来源于stack exchange,提问作者Tom Finet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:15:03