没有找到重载函数
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>;
};
如果需要,您可以将其他比较功能留在那里。我删除了它,因为看起来您只是为地图定义了它。
我有 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>;
};
如果需要,您可以将其他比较功能留在那里。我删除了它,因为看起来您只是为地图定义了它。