使用隐式比较器和一个在C ++中具有结构作为键的映射

时间:2015-09-23 18:29:11

标签: c++ dictionary struct

我想使用标准libc ++的地图。所以定义运算符<对于密钥类型是一种实例化地图的解决方案。我做到了,但它不起作用。

我检查了那个运营商<工作(编译和执行)。

png_pixel p1, p2;
p1.red = 5; p2.red = 20; // init
if(p1 < p2)
  puts("true");
else
  puts("false");

这是运算符&lt;:

的定义
#include <tuple> // C++11

bool
operator<(const png_pixel& a, const png_pixel& b)
{
  return std::tie(a.red, a.green, a.blue, a.alpha) < std::tie(b.red, b.green, b.blue, b.alpha);
}

png_pixel是一个像这样定义的结构:

// My source code code
typedef png::rgba_pixel png_pixel;

// libpng++ rgba_pixel.hpp http://www.nongnu.org/pngpp/
namespace png
{
    template< typename T >
    struct basic_rgba_pixel
    {
        typedef pixel_traits< basic_rgba_pixel< T > > traits;

        basic_rgba_pixel()
            : red(0), green(0), blue(0), alpha(0)
        {
        }

        /**
         * \brief Constructs rgba_pixel object from \a red, \a green,
         * \a blue and \a alpha components passed as parameters.
         * Alpha defaults to full opacity.
         */
        basic_rgba_pixel(T red, T green, T blue,
                         T alpha = traits::get_alpha_filler())
            : red(red), green(green), blue(blue), alpha(alpha)
        {
        }

        T red;
        T green;
        T blue;
        T alpha;
    };

    typedef basic_rgba_pixel< byte > rgba_pixel;

    // other things
}

但是当我尝试将png_pixel用作C ++地图中的键时,GCC和Clang并不满意。

# GCC 4.9
error: no match for ‘operator<’
       (operand types are ‘const png::basic_rgba_pixel<unsigned char>’
       and ‘const png::basic_rgba_pixel<unsigned char>’)

# Clang 3.5
error: invalid operands to binary expression
      ('const png::basic_rgba_pixel<unsigned char>'
      and 'const png::basic_rgba_pixel<unsigned char>')

如果需要,https://gitlab.com/RyDroid/Libre2DCarRacingsSimulator的分支地图转换器中提供了完整的源代码 libpng ++至少在Debian中打包为libpng ++ - dev。

问候。

1 个答案:

答案 0 :(得分:0)

您的operator<不在std::less的模板定义上下文中,std::map的默认比较器,无论如何可能被大量operator<隐藏在std中用于普通的非限定查找,因此如果要使用它,则必须由ADL找到。但它不在png命名空间中,png::basic_rgba_pixel<unsigned char>唯一关联的命名空间,因此ADL也找不到它。

编写比较器函数对象并将其传递给map。您也可以尝试将其放入png命名空间,但感觉更糟糕。