1

我使用此代码来找到g方向上最远的框()点d 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_tpoint

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

我知道调用了错误的函数,但我不明白为什么……</p>

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

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

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

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

4

2 回答 2

1

如果您确实需要重载运算符 != 像它一样通用,即采用任意两个参数,即几乎匹配您传递给它的任何内容,您可以通过显式调用标准库版本来避免迭代器首选它:

std::operator !=(it, corners.end())
于 2013-09-04T02:57:55.477 回答
1

我不明白为什么你需要这个模板功能。但很明显,它可能已经推断出 lhs 和 rhs 类型是iterator你只想将它用于point_t

两种解决方案:

  1. 删除运算符定义上的模板并使用 point_t 作为类型(所以你确定)
  2. 删除 using 命名空间以确保他在namespace point
于 2013-09-03T21:42:32.653 回答