簡體   English   中英

運算符重載和迭代器混亂

[英]Operator overloading and iterator confusion

我使用此代碼查找在方向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;

對於命名空間point的類vector_t ,運算符!=也有模板運算符重載。

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. 刪除正在使用的名稱空間,以確保他在namespace point之外看到迭代器

如果確實需要重載的運算符!=照原樣通用,即采用任何兩個參數,即幾乎匹配傳遞給它的任何內容,則可以通過顯式調用標准庫版本來避免被迭代器首選:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM