解决操作员的歧义

时间:2011-03-09 11:32:28

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

我有以下地图类型......

std::map<D3DXCOLOR, ID3DXMesh*>

在编译期间,xfunctional抱怨无法解决关键类型的歧义;

error C2593: 'operator <' is ambiguous

编译器检测到的候选运算符如下;

  1. 内置C ++运算符&lt;(DWORD,DWORD)
  2. 内置C ++运算符&lt;(FLOAT,FLOAT)
  3. 内置C ++运算符&lt;(D3DCOLORVALUE,D3DCOLORVALUE)
  4. D3DXCOLOR结构分别由4个浮点数 r g b a 组成,但不包含定义一个运算符&lt;。但它确实为DWORD FLOAT和D3DCOLORVALUE提供了强制转换函数,因此它们是候选列表中的条目。

    我正在考虑解决此问题的最佳方法。我可以为D3DXCOLOR编写自己的内联运算符,将颜色包装在一个提供自己的运算符&lt;的新类中,或者是否有可能以某种方式暗示编译器应该从候选列表中选择哪个实现? DWORD运算符&lt;会充分满足我的要求。

5 个答案:

答案 0 :(得分:3)

您有三种选择。例如,假设您希望将它们作为颜色值进行比较:

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)为地图提供第三个模板参数 - 请注意,这会更改地图的类型,因此如果您经常地传递地图,这可能会带来不便。但它表示排序仅用于此地图,而不是用于任何其他目的的规范“正确”颜色顺序。

struct mycomparator {
    bool operator()(const D3DXCOLOR &lhs, const D3DXCOLOR &rhs) {
        return static_cast<D3DCOLORVALUE>(lhs) < static_cast<D3DCOLORVALUE>(rhs);
    }    
};

std::map<D3DXCOLOR, ID3DXMesh*, mycomparator>

答案 1 :(得分:2)

您可以将一个小于函子传递给应该使用的map类模板。

struct D3DXCOLOR_less {
    bool operator ()(D3DXCOLOR const&a, D3DXCOLOR const& b) const { … }
};

std::map<D3DXCOLOR, ID3DXMesh*, D3DXCOLOR_less> foo;

这绝对是我在这种情况下会做的,除非在其他情况下你也需要operator <这个类。

答案 2 :(得分:0)

您需要编写自己的运算符&lt;,或者为地图提供比较器仿函数。

struct CompareColor {
  bool operator()(D3DXCOLOR const & L, D3DXCOLOR const & R) const {
    // Compare and return whether L is less than R
  }
}

map<D3DXCOLOR, ID3DXMesh*, CompareColor> TheMap;

答案 3 :(得分:0)

operator<定义D3DXCOLOR函数,为

bool operator<(const D3DXCOLOR &c1, const D3DXCOLOR &c2)
{
   return <some boolean value>;
}

或者定义一个名为D3DXCOLOR_LESS比较仿函数,并将其作为第三个参数传递给std::map

struct D3DXCOLOR_LESS
{
    bool operator()(const D3DXCOLOR &c1, const D3DXCOLOR &c2)
    {
       return <some boolean value>;
    }
};

std::map<D3DXCOLOR, ID3DXMesh*, D3DXCOLOR_LESS>  colormap;

答案 4 :(得分:0)

实际上RGBA颜色没有像任何标量那样的默认准序。并且您不应该在全局上下文中定义一个,但是您可以定义自己的排序并在std :: map模板实例中指定它。请参阅http://www.sgi.com/tech/stl/Map.html

中的参数说明