c++ - 尝试使用 operator[] 访问 std::map 元素时出现编译器错误

标签 c++ data-structures map compiler-errors typedef

我正在尝试按键访问 map 数据结构的元素,但遇到编译器错误。我已经使用 typedef 定义了我的 map 数据结构,以简化 map 实例化的语法。如您所见,键是 string 类型,数据是自定义 GameComponent 对象:

typedef map<string, GameComponent*> ComponentMap;
typedef map<string, GameComponent*>::iterator ComponentMapIter;
typedef map<string, GameComponent*>::const_iterator ComponentMapCIter;

GameComponent 的派生类中,我正在为存储在 map 中的每个唯一 GameComponent 对象创建标准的 Composite 模式方法和访问器。但是,使用数组下标运算符访问访问器中的对象会导致编译错误:

void Character::add(const string& key, GameComponent* comp)
{
    m_components->insert( make_pair(key, comp) );
}

void Character::remove(const string& key)
{
    m_components->erase(key);
}

Armor* Character::getArmor() const
{
    // ERROR:
    return static_cast<Armor*>(m_components["Armor"]);
}

Weapon* Character::getWeapon() const
{
    // ERROR:
    return static_cast<Weapon*>(m_components["Weapon"]);
}

Attributes* Character::getAttributes() const
{
    // ERROR:
    return static_cast<Attributes*>(m_components["Attributes"]);
}

编译器错误的输出显示“无效类型”错误,这让我挠头:

/Users/Dylan/Desktop/RPG/character.cpp: In member function 'Armor* Character::getArmor() const':
/Users/Dylan/Desktop/RPG/character.cpp:66: error: invalid types 'ComponentMap* const[const char [6]]' for array subscript
/Users/Dylan/Desktop/RPG/character.cpp: In member function 'Weapon* Character::getWeapon() const':
/Users/Dylan/Desktop/RPG/character.cpp:71: error: invalid types 'ComponentMap* const[const char [7]]' for array subscript
/Users/Dylan/Desktop/RPG/character.cpp: In member function 'Attributes* Character::getAttributes() const':
/Users/Dylan/Desktop/RPG/character.cpp:76: error: invalid types 'ComponentMap* const[const char [11]]' for array subscript

最佳答案

m_components 似乎是 ComponentMap* 类型。 当您编写 m_components["Armor"] 时,编译器会将其解释为访问 "Armor" - ComponentMap 动态数组的第一个元素,这没有任何意义。

你想要的是(*m_components)["some string"]。这将调用 ComponentMapoperator[],但正如 Luchian Grigore 和 Olaf Dietsche 提到的,std::map::operator[] 不会有一个 const 重载,所以这也会失败。剩下的唯一选择是使用 find

简化版将是:

Armor* Character::getArmor() const
{
    return static_cast<Armor*>(m_components->find("Armor")->second);
}

Weapon* Character::getWeapon() const
{
    return static_cast<Weapon*>(m_components->find("Weapon")->second);
}

Attributes* Character::getAttributes() const
{
    return static_cast<Attributes*>(m_components->find("Attributes")->second);
}

此代码与原始示例的行为不同,如果 m_components 没有 "Armor""Weapon",则会失败> 和 “属性” 元素。 我们能得到的最接近的方法是显式处理元素缺失并返回 0nullptr(如果您使用 C++11)。

最终正确的 C++03 兼容版本:

Armor* Character::getArmor() const
{
    ComponentMapCIter i = m_components->find("Armor");
    if (i != m_components->end())
        return static_cast<Armor*>(i->second);
    return 0;
}

Weapon* Character::getWeapon() const
{
    ComponentMapCIter i = m_components->find("Weapon");
    if (i != m_components->end())
        return static_cast<Weapon*>(i->second);
    return 0;
}

Attributes* Character::getAttributes() const
{
    ComponentMapCIter i = m_components->find("Attributes");
    if (i != m_components->end())
        return static_cast<Attributes*>(i->second);
    return 0;
}

关于c++ - 尝试使用 operator[] 访问 std::map 元素时出现编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14044862/

相关文章:

c++ - 无锁堆栈与原子

java - 如何使用两个迭代器遍历 HashMap?

C++将带有构造函数的对象插入 map

c++ - 按 lexicographical_compare() 函数排序

c - 使用读/写函数在 C 中调整哈希表大小

algorithm - 具有快速排序插入、排序删除和查找的数据结构

java - 更好的 map 构造器

python - 如何在运行时在通过 Cython 导入的 C++ 头文件中设置常量?

c++ - 从文件读取后出现奇怪的输出

c++ - v8、libuv、nodejs、win32 api - 如何调用 EnumWindows 并回调调用 javascript 函数?