Error: no match for 'operator==' for boost::tuple

Error: no match for 'operator==' for boost::tuple

我打算为 boost::tuple

定义自定义 operator==
#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; }

所以,我的问题是,为什么编译器在 std::find.

的情况下不在全局命名空间中查找 operator==

注意:如果我将 operator== 放在命名空间 boost::tuples 中,它会起作用,如上面的评论所示。

您应该包含一个附加文件:

#include "boost/tuple/tuple_comparison.hpp"

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

它不在全局命名空间中查找的原因是由于 ADL 的规则,它只会在 boost::tuples 命名空间(定义元组的位置)中查找,而 std命名空间。

阅读What is “Argument-Dependent Lookup” (aka ADL, or “Koenig Lookup”)了解更多信息

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