没有找到重载函数

no overloaded function found

我有 class KeyA 来自第三方,将作为使用中的密钥。当我定义一个“<”运算符时,它会抱怨:

error: no match for ‘operator<’ (operand types are ‘const KeyA’ and ‘const KeyA’)

显示问题的一些简化代码:

#include <map>
using namespace std;

struct KeyA {  // defined in somewhere else
    int a;
};

namespace NS {
struct config {
    using Key = KeyA; // type alias
    using Table = map<Key, int>;
};

bool operator <(const config::Key& lhs, const config::Key& rhs) {
    return lhs.a <rhs.a ;
}
}

int main()
{
    using namespace NS;
    config::Table table;
    table[{1}]= 2;

    return 0;
}

这里发生了什么?以及如何解决这个问题(无法触及 KeyA 并且很可能必须将重载函数保留在 NS 中)?

您可以使用以下完整的工作program来解决您的问题。

#include <map>
using namespace std;

struct KeyA {  // defined in somewhere else
    int a;
    //friend declaration
    friend bool operator <(const KeyA& lhs, const KeyA& rhs);
};
bool operator <(const KeyA& lhs, const KeyA& rhs) {
    return lhs.a <rhs.a ;
}
namespace NS {
struct config {
    using Key = KeyA; // type alias
    using Table = map<Key, int>;
};


}

int main()
{
    using namespace NS;
    config::Table table;
    table[{1}]= 2;

    return 0;
}

上面程序的输出可见here.

一个简单的选择是只定义您自己的比较器并将其提供给 std::map 模板参数:

struct config
{
    using Key = KeyA; // type alias

    struct KeyLess {
        bool operator ()(const Key& lhs, const Key& rhs) const {
            return lhs.a < rhs.a;
        }
    };

    using Table = map<Key, int, KeyLess>;
};

如果需要,您可以将其他比较功能留在那里。我删除了它,因为看起来您只是为地图定义了它。