运算符重载和迭代器混淆

时间:2013-09-03 21:39:45

标签: c++ templates stl iterator operator-overloading

我使用此代码查找方向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_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迭代器comparaison,以及如何防止使用此函数。

注1:我从模板开始,所以我可能在不知情的情况下做了一些非常错误的事情,如果是这样,请好好告诉。

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

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

2 个答案:

答案 0 :(得分:1)

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

时,它可能推断lhs和rhs类型为point_t

两种解决方案:

  1. 删除操作员定义上的模板,并使用point_t作为类型(所以你确定)
  2. 删除using命名空间以确保他在namespace point
  3. 之外看到迭代器

答案 1 :(得分:1)

如果你确实需要那个重载的运算符!=就像通用那样,那就是任何两个参数,即匹配你传递给它的任何东西,你可以避免它被优先考虑显式调用标准库版本的迭代器:

std::operator !=(it, corners.end())