我想使用标准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。
问候。
答案 0 :(得分:0)
您的operator<
不在std::less
的模板定义上下文中,std::map
的默认比较器,无论如何可能被大量operator<
隐藏在std
中用于普通的非限定查找,因此如果要使用它,则必须由ADL找到。但它不在png
命名空间中,png::basic_rgba_pixel<unsigned char>
唯一关联的命名空间,因此ADL也找不到它。
编写比较器函数对象并将其传递给map
。您也可以尝试将其放入png
命名空间,但感觉更糟糕。