gpt4 book ai didi

c++ - 错误:boost::tuple 的 'operator==' 不匹配

转载 作者:搜寻专家 更新时间:2023-10-31 00:12:50 24 4
gpt4 key购买 nike

我打算为 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”)了解更多信息

关于c++ - 错误:boost::tuple 的 'operator==' 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29121682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com