gpt4 book ai didi

c++ - 在 std::find 中使用来自不同命名空间的运算符

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:49:50 25 4
gpt4 key购买 nike

我有以下自动生成的代码:

#include <vector>
#include <algorithm>

namespace foo{
struct S{};
namespace inner{
bool operator==(const S&,const S&){return true;}
}
}

namespace bar{
void func();
}

我现在想使用 STL 的 find 算法在容器中搜索 S 对象:

void bar::func(){
std::vector<foo::S> v;
foo::S s;
std::find(v.begin(),v.end(),s);
}

但是我得到这个错误:

/opt/compiler-explorer/gcc-8.3.0/include/c++/8.3.0/bits/predefined_ops.h:241:17:
error: no match for 'operator==' (operand types are 'foo::S' and 'const foo::S')

{ return *__it == _M_value; }

即使在添加 using foo::inner::operator==; 之后,我也会遇到同样的错误:

void bar::func(){
using foo::inner::operator==;
std::vector<foo::S> v;
foo::S s;
std::find(v.begin(),v.end(),s);
}

但是,当我这样做时它起作用了:

void bar::func(){
std::vector<foo::S> v;
foo::S s;
std::find_if(v.begin(),v.end(),[s](foo::S e){
using foo::inner::operator==;
return s==e;
});
}

我的两个问题是:

  • 为什么第一个例子会出错? (添加 using 后)
  • 如何解决? (不改变生成的代码)

编辑:

感谢 Max 的回答 ( https://stackoverflow.com/a/55517500/8900666 ),我找到了解决此问题的方法(有点难看但有效):

// Generated code
#include <vector>
#include <algorithm>

namespace foo{
struct S{};
namespace inner{
bool operator==(const S&,const S&){return true;}
}
}
namespace bar{
void func();
}

// My code
namespace foo{
using inner::operator==;
}

void bar::func(){
std::vector<foo::S> v;
foo::S s;
std::find(v.begin(),v.end(),s);
}

最佳答案

问题是参数相关查找 (ADL)。

std::find 模板中的某处,有一个 if (*it == value),其中 valueit 是依赖类型。这意味着编译器将等到模板被实例化以寻找要使用的正确 operator==

但是它查找 operator== 的地方或多或少限于(没有深入到非限定名称查找的细节):

  • 所有封闭的命名空间 - 但此处的搜索会在找到任何 operator== 时停止。 (与您无关,但可能会绊倒那些只是将操作符添加到全局命名空间中的人,例如 std 对象,例如“支持” operator+ 用于 std: : vector ).

  • 执行 ADL - 搜索对象的命名空间(*it*value 来自)以匹配 operator==.

但是无法以这种方式找到您要使用的 operator== - 它位于不同的(更深的)命名空间中。这基本上是生成代码中的一个错误 - 运算符应始终驻留在与它们所操作的对象定义的 namespace 相同的 namespace 中。

所以答案是:

  1. 找不到您的 operator==,因为它位于错误的命名空间中。

  2. 这里没有问题,因为在 lambda 中找到了正确的运算符,std::find_if 只是直接使用 lambda(根本没有查找)。

关于c++ - 在 std::find 中使用来自不同命名空间的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55517376/

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