У меня есть следующий код, который генерируется автоматически:
#include <vector>
#include <algorithm>
namespace foo{
struct S{};
namespace inner{
bool operator==(const S&,const S&){return true;}
}
}
namespace bar{
void func();
}
Теперь я хочу найти контейнер для S
объекта, используя алгоритм find
STL:
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
)
- Как это можно исправить? (без изменения сгенерированного кода)
Edit:
Благодаря ответу Макса (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);
}