c++ - 解决运算符歧义

标签 c++ data-structures directx operator-overloading

我有以下 map 类型...

std::map<D3DXCOLOR, ID3DXMesh*>

在编译期间,xfunctional 提示它无法解决关于键类型的歧义

error C2593: 'operator <' is ambiguous

编译器检测到的候选操作符如下;

  1. 内置 C++ 运算符<(DWORD, DWORD)
  2. 内置 C++ 运算符<(FLOAT, FLOAT)
  3. 内置 C++ 运算符<(D3DCOLORVALUE, D3DCOLORVALUE)

D3DXCOLOR 结构由 4 个 float 组成,分别为 rgba 但不定义一个运算符 <.然而,它确实为 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/

相关文章:

c++ - 为什么我不能返回一个 vector<vector<int>> (Process returned -1073741819 (0xC0000005))

c++ - 如何返回对 'empty' 对象的引用

python - 这个数据结构有一个友好的名字吗?

c++ - 为什么我的选择功能会出现意外行为?

directx - HLSL:高斯模糊效果

c++ - 长双二维动态数组C++

c++ - 从 msvc c++ 执行控制台应用程序

java - 在 Java 集合排序中使用 Comparator 接口(interface)比较方法返回值 -1, 0, 1 到底意味着什么?

.net - 将对象列表绑定(bind)到网格而不是数据表有什么好处? (。网)

c++ - 无法绘制正方形 DirectX 12 c++