错误:对于boost :: tuple,'operator =='不匹配

时间:2015-03-18 12:09:42

标签: c++ boost operator-overloading

我打算为operator==

定义自定义boost::tuple
#include <iostream>
#include <vector>
#include <boost/tuple/tuple.hpp>
//#include <boost/tuple/tuple_comparison.hpp>

/*namespace boost { namespace tuples {*/
bool operator==(const boost::tuple<int>&, const boost::tuple<int>&){
  return false;    
}
/*}}*/

int main(){
  boost::tuple<int> t, u;      
  std::vector<boost::tuple<int> > vec;

  std::cout << (t == u); // [1]

  find(vec.begin(), vec.end(), t); // [2]
}

虽然这适用于[1],但[2]失败并出现以下错误:

/usr/local/include/c++/4.9.2/bits/predefined_ops.h:191:17: error:
no match for 'operator==' (operand types are 'boost::tuples::tuple<int>'
and 'const boost::tuples::tuple<int>')
  { return *__it == _M_value; }

所以,我的问题是,为什么编译器在operator==的情况下不在全局命名空间中查找std::find

注意:如果我将operator==放在名称空间boost::tuples中,如上面的评论中所示,则会有效。

2 个答案:

答案 0 :(得分:4)

您应该添加一个附加文件:

#include "boost/tuple/tuple_comparison.hpp"

由于运算符是在单独的标题中定义的。

它没有查看全局命名空间的原因是由于ADL的规则,它只会查看boost::tuples命名空间(定义元组的位置)和std命名空间。

阅读What is “Argument-Dependent Lookup” (aka ADL, or “Koenig Lookup”)了解详情

答案 1 :(得分:2)

ADL。当您在代码中使用operator ==时,namespace boost::tuplesglobal namespace会被处理。 但是,由于find只在std命名空间中,因此只会处理stdboost::tuples