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::tuples
和 global namespace
被处理。
但是,由于 find 在 std 命名空间中,只有 std
和 boost::tuples
将被处理。
我打算为 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::tuples
和 global namespace
被处理。
但是,由于 find 在 std 命名空间中,只有 std
和 boost::tuples
将被处理。