【发布时间】:2019-08-26 07:03:45
【问题描述】:
我有以下自动生成的代码:
#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);
}
【问题讨论】:
-
@LeonardoFaria 究竟是在哪里添加
using语句? -
我将添加一个带有
using的sn-p 以便更好地理解 -
@LeonardoFaria - 谢谢!
-
添加了sn-p(倒数第二个)
-
第一种情况由于 ADL 而不起作用 - 编译器在命名空间
foo而不是foo::inner中查找operator==。在命名空间foo中添加using inner::operator==。