[英]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
兩種解決方案:
namespace point
之外看到迭代器 如果確實需要重載的運算符!=照原樣通用,即采用任何兩個參數,即幾乎匹配傳遞給它的任何內容,則可以通過顯式調用標准庫版本來避免被迭代器首選:
std::operator !=(it, corners.end())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.