gpt4 book ai didi

c++ - 运算符重载和迭代器混淆

转载 作者:行者123 更新时间:2023-11-30 04:14:58 25 4
gpt4 key购买 nike

我使用此代码找到在 d 方向上最远的方框 (g) 的点 typedef vector_t point_t;

std::vector<point_t> corners = g.getAllCorners();
coordinate_type last_val = 0;

std::vector<point_t>::const_iterator it = corners.begin();
point_t last_max = *it;

do
{
coordinate_type new_val = dot_product( *it, d );
if( new_val > last_val )
{
last_val = new_val;
last_max = *it;
}
}
while( it != corners.end() );

return last_max;

对于 vector_t 类的运算符 != 我还有一个模板运算符重载,它位于命名空间 point 中。

namespace point
{
template
<
typename lhs_vector3d_impl,
typename rhs_vector3d_impl
>
bool operator!=( const typename lhs_vector3d_impl& lhs, const typename rhs_vector3d_impl& rhs )
{
return binary_operator_not_equal<lhs_vector3d_impl, rhs_vector3d_impl>::apply( lhs, rhs );
}
};

重载在大多数情况下都可以正常工作,但是当我使用迭代器(即 it != corners.end())时,它会崩溃,因为在那种情况下我不打算使用这个函数。我可以说这是因为模板参数解析出错了,但我不知道为什么:

lhs_vector3d_impl=std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<legend::geometry::point::Carray_Vector3d<int32_t>>>>,
rhs_vector3d_impl=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<legend::geometry::point::Carray_Vector3d<int32_t>>>>

我知道调用了错误的函数,但我不明白为什么......

所以基本上我的问题是如何使用我的函数而不是 std 命名空间中的运算符来解决 comme 迭代器比较,以及如何防止使用此函数。

注意 1:我是从模板开始的,所以我可能在不知不觉中做错了一些事情,如果是这样,请告诉我。

注意 2:这段代码主要用于学术目的,所以我真的想手工完成大部分代码。

注3:使用Visual Studio 2012 C++编译器

最佳答案

我不明白你为什么需要这个模板函数。但很明显,当您只想将它​​用于 point_t

时,它可能已经推断出 lhs 和 rhs 类型是 iterator

两种解决方案:

  1. 删除运算符定义上的模板并使用 point_t 作为类型(所以你确定)
  2. 删除一个 using 命名空间以确保他在 命名空间点 之外看到迭代器

关于c++ - 运算符重载和迭代器混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18601952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com