我打算为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
中,如上面的评论中所示,则会有效。
答案 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::tuples
和global namespace
会被处理。
但是,由于find只在std命名空间中,因此只会处理std
和boost::tuples
。