日期:2014-05-16  浏览次数:21008 次

STL queue源码中友元函数是干嘛的?
#ifndef __STL_LIMITED_DEFAULT_TEMPLATES  
template <class T, class Sequence = deque<T> >  
#else  
template <class T, class Sequence>  
#endif  
class queue  
{  
  friend bool operator== __STL_NULL_TMPL_ARGS (const queue& x, const queue& y);  
  friend bool operator< __STL_NULL_TMPL_ARGS (const queue& x, const queue& y);
  
  
public:  
  // pointer, iterator, difference_type  
  typedef typename Sequence::value_type value_type;  
  typedef typename Sequence::size_type size_type;  
  typedef typename Sequence::reference reference;  
  typedef typename Sequence::const_reference const_reference;  
  
protected:  
  Sequence c;   // 这个是我们实际维护的容器  
  
public:  
  bool empty() const { return c.empty(); }  
  size_type size() const { return c.size(); }  
  reference front() { return c.front(); }  
  const_reference front() const { return c.front(); }  
  reference back() { return c.back(); }  
  const_reference back() const { return c.back(); }  
  void push(const value_type& x) { c.push_back(x); }  
  void pop() { c.pop_front(); }  
};  
------解决方案--------------------
这个是声明模板化的友元函数,这个操作符重载函数是全局的.
例如:

queue<int>  _qa;
queue<int>  _qb;

if( _qa == _qb) // 这个会调用全局重载操作符函数,声明友元后operator ==函数才可以访问queue<int>类的内部成员
    ...
else if( _qa < _qb)
    ...

其余的 != 和 > 之类的操作符逻辑都可以通过operator == 和 operator < 这两个操作符推断.
码字不易,给分吧
------解决方案--------------------
重载操作符,可以让相同类型的dequeue进行比较。