我有以下 map 类型...
std::map<D3DXCOLOR, ID3DXMesh*>
在编译期间,xfunctional 提示它无法解决关于键类型的歧义;
error C2593: 'operator <' is ambiguous
编译器检测到的候选操作符如下;
- 内置 C++ 运算符<(DWORD, DWORD)
- 内置 C++ 运算符<(FLOAT, FLOAT)
- 内置 C++ 运算符<(D3DCOLORVALUE, D3DCOLORVALUE)
D3DXCOLOR 结构由 4 个 float 组成,分别为 r、g、b 和 a 但不定义一个运算符 <.然而,它确实为 DWORD FLOAT 和 D3DCOLORVALUE 提供了转换函数,因此在候选列表中有条目。
我正在考虑解决这个问题的最佳方法。我可以为 D3DXCOLOR 编写自己的内联运算符,将颜色包装在一个提供自己的运算符 < 的新类中,或者是否可以以某种方式向编译器提示应该从候选列表中选择哪个实现? DWORD 运算符 < 可以充分满足我的要求。
最佳答案
您有三个选择。例如,假设您希望将它们作为颜色值进行比较:
1) 定义operator<
:
bool operator<(const D3DXCOLOR &lhs, const D3DXCOLOR &rhs) {
return static_cast<D3DCOLORVALUE>(lhs) < static_cast<D3DCOLORVALUE>(rhs);
}
2) 特化 std::less
:
namespace std {
template <>
struct less<D3DXCOLOR> {
bool operator()(const D3DXCOLOR &lhs, const D3DXCOLOR &rhs) {
return static_cast<D3DCOLORVALUE>(lhs) < static_cast<D3DCOLORVALUE>(rhs);
}
};
}
3) 为您的 map 提供第三个模板参数 - 请注意,这会更改 map 的类型,因此如果您经常传递 map ,这可能会带来不便。但它表示该顺序仅用于此 map ,而不是用于任何其他目的的规范“正确”颜色顺序。
struct mycomparator {
bool operator()(const D3DXCOLOR &lhs, const D3DXCOLOR &rhs) {
return static_cast<D3DCOLORVALUE>(lhs) < static_cast<D3DCOLORVALUE>(rhs);
}
};
std::map<D3DXCOLOR, ID3DXMesh*, mycomparator>
关于c++ - 解决运算符歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5245172/