使用 Structs 作为映射中的键,忽略 == 运算符,误报

Using Structs as keys in maps, ignoring == operators, false positive

我正在尝试将结构用作映射中的键,但尽管定义了 <== 运算符,但我得到了误报:

return models[mr]; 即使新的 ImportSettingsreverse = true 而模型中的那个有 `reverse = false.

也会返回

Visual studio 调试器还显示 == 的运算符调用甚至没有被调用。我在这里误解了什么?

struct HE2_ImportSettings
{
    bool reverseWindingOrder = false;

    bool operator==(const HE2_ImportSettings& other)const
    {
        return reverseWindingOrder == other.reverseWindingOrder;
    }
};

struct ModelReference
{
    std::string filepath = "";
    HE2_ImportSettings importSettings = {};

    bool ModelReference::operator == (const ModelReference& other) const
    {
        return filepath == other.filepath && importSettings == other.importSettings;
    }
    bool ModelReference::operator< (const ModelReference& other) const
    {
        return filepath < other.filepath;
    }
};



ModelReference mr = { filename, importSettings };

bool exists = models.count(mr);
if (exists)
{
    //This is returning even when the new importsettings has reverse = true and the one in models has reverse = false
    return models[mr];
}

std::map 使用等价的概念。当

时两个元素是等价的
!(a < b) && !(b < a)

换句话说,地图从不使用 == 来查看两个元素是否相同。在您的地图中,当两个元素具有相同的 filepath 时,它们被认为是等价的。如果您还想将 importSettings 考虑到地图中的排序,您还需要在 operator<.

中进行比较