使用自定义运算符时出错<与std :: less

时间:2010-09-15 11:49:05

标签: c++

我正在尝试重载<运算符,但遇到问题。

这是我的实施:

int Vector3D::operator < (const Vector3D &vector)
{
   if(x<vector.x)
       return 1;
   else
       return 0;
}

我使用此代码调用它:

std::map<Vector3D, std::vector<const NeighborTuple *> > position; 
std::set<Vector3D> pos; 
for (NeighborSet::iterator it = N.begin(); it != N.end(); it++)
{
    NeighborTuple const  &nb_tuple = *it;

    Vector exposition;
    pos.insert (exposition);
    position[exposition].push_back (&nb_tuple);
}

但是我收到了这个错误:

  

/ usr / include / c ++ / 4.1.2 / bits / stl_function.h:在成员函数'bool std :: less&lt; _Tp&gt; :: operator()(const _Tp&amp;,const _Tp&amp;)const [with _Tp = ns3 :: Vector3D]':
  /usr/include/c++/4.1.2/bits/stl_map.h:347:从'_Tp&amp;中实例化std :: map&lt; _Key,_Tp,_Compare,_Alloc&gt; :: operator [](const _Key&amp;)[with _Key = ns3 :: Vector3D,_Tp = std :: vector&lt; const ns3 :: olsr :: NeighborTuple *,std :: allocator&lt; const ns3 :: olsr :: NeighborTuple *&gt; &gt;,_ Compare = std :: less&lt; ns3 :: Vector3D&gt;,_ Alloc = std :: allocator&lt; std :: pair&lt; const ns3 :: Vector3D,std :: vector&lt; const ns3 :: olsr :: NeighborTuple *,std :: allocator&lt; const ns3 :: olsr :: NeighborTuple *&gt; &GT; &GT; &GT;]”
  ../src/routing/olsr/olsr-routing-protocol.cc:853:从这里实例化

  /usr/include/c++/4.1.2/bits/stl_function.h:227:错误:将'const ns3 :: Vector3D'作为'int ns3 :: Vector3D :: operator&lt;(const ns3 ::)的'this'参数传递Vector3D&amp;)'丢弃限定符

2 个答案:

答案 0 :(得分:13)

错误

  

传递'const ns3 :: Vector3D'为   'int'的'this'参数   NS3 ::的Vector3D ::运算≤(const的   ns3 :: Vector3D&amp;)'丢弃限定符

表示你的operator<没有承诺比较不会修改左手参数,而地图要求比较操作不应该修改任何东西并试图使用此运算符常量实例(映射将键类型存储为const对象)。

简而言之,这样的运算符重载决不能改变任何东西,并且两个操作数都必须声明为const。由于您已将此作为成员函数重载,因此必须使该函数本身为const。

bool operator<(const ns3::Vector3D& rhs) const;
顺便说一句,你为什么不返回一个布尔(结果必须是真或假)?

答案 1 :(得分:1)

看起来你需要使用const_iterators:

NeighborSet:迭代

应该是

NeighborSet ::为const_iterator

此外,如果您的编译器支持它(C ++ 0x),请使用cbegin和cend而不是begin和end。