1

基于pp130

但是,如果有一个版本支持 T 和兼容类型之间的比较,那就太好了,这只是添加更多重载的一种情况。为了对称,您需要允许任一类型位于操作的左侧。(手动添加运算符时很容易忘记这一点;人们往往只看清楚右侧必须接受另一种类型的事实。当然,您的 less_than 的两种类型版本不会犯这种愚蠢的错误,对吧?)

template <class T,class U>
class less_than2
{
public:
  friend bool operator<=(const T& lhs,const U& rhs) { 
    return !(lhs>rhs); 
  }

  friend bool operator>=(const T& lhs,const U& rhs) { 
    return !(lhs<rhs); 
  }

  friend bool operator>(const U& lhs,const T& rhs) {
    return rhs<lhs; 
  }

  friend bool operator<(const U& lhs,const T& rhs)  { 
    return rhs>lhs; 
  }

  friend bool operator<=(const U& lhs,const T& rhs) { 
    return !(rhs<lhs); 
  }

  friend bool operator>=(const U& lhs,const T& rhs) { 
    return !(rhs>lhs); 
  }
};

问题> 为什么我们不必提供以下两个功能?

  friend bool operator>(const T& lhs,const U& rhs) {
    return rhs<lhs; 
  }

  friend bool operator<(const T& lhs,const U& rhs)  { 
    return rhs>lhs; 
  }
4

1 回答 1

1

该运算符:

friend bool operator>=(const T& lhs,const U& rhs) { 
  return !(lhs<rhs); 
}

取决于函数调用的有效性lhr<rhs。您第二次提供其签名operator<(const T&, const U&)没有意义(甚至是错误的)。

同样适用于第二次过载。

于 2012-04-07T14:55:59.807 回答