【问题标题】:Using implicit comparator with a map that has a struct as key in C++在 C++ 中将隐式比较器与具有结构作为键的映射一起使用
【发布时间】:2015-09-24 02:36:34
【问题描述】:

我想使用标准 libc++ 的映射。因此,为键类型定义 operator

我检查了 operator

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

这就是运算符的定义<:>

#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
}

但是当我尝试在 C++ 映射中使用 png_pixel 作为键时,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。

问候。

【问题讨论】:

  • operator&lt; 函数的声明在 map 的创建点是否可用?请发帖MCVE
  • 您的示例代码中没有“地图” - 请提供适当的测试用例
  • 我认为这可能是一个命名空间的事情。有png::basic_rgba_pixelstd::map::operator&lt;。三个不同的命名空间。

标签: c++ dictionary struct


【解决方案1】:

您的operator&lt; 不在std::less 的模板定义上下文中,std::map 的默认比较器,并且无论如何都可能被std 中的大量operator&lt;s 隐藏,用于普通的不合格查找,所以要使用的话,必须要被ADL找到。但它不在png命名空间中,这是png::basic_rgba_pixel&lt;unsigned char&gt;唯一关联的命名空间,所以ADL也找不到。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
相关资源
最近更新 更多