C++ 标准:设置<;字符串,CustomComparer>;无法将std::find(…)用于

C++ 标准:设置<;字符串,CustomComparer>;无法将std::find(…)用于,c++,compiler-errors,find,set,C++,Compiler Errors,Find,Set,我有以下无法编译的代码: #include <iostream> #include <set> #include <functional> #include <cstring> using namespace std; struct StringCompareNoRegister: public binary_function<string, string, bool> { bool operator()(string cons

我有以下无法编译的代码:

#include <iostream>
#include <set>
#include <functional>
#include <cstring>

using namespace std;

struct StringCompareNoRegister: public binary_function<string, string, bool> {
  bool operator()(string const& lhs, string const& rhs) const {
    return (_stricmp(lhs.c_str(), rhs.c_str()) < 0);
  }
};

int wmain() {
  set<string, StringCompareNoRegister> s;
  s.insert("hello");
  s.insert("STL");
  s.insert("Hello");
  wcout << s.find("Hello")->c_str() << endl;
  wcout << find(s.begin(), s.end(), "Hello")->c_str() << endl;

  return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
StringCompareRegister结构:公共二进制函数{
布尔运算符()(字符串常量和lhs、字符串常量和rhs)常量{
返回(_stricmp(lhs.c_str(),rhs.c_str())<0);
}
};
int wmain(){
设置s;
s、 插入(“你好”);
s、 插入(“STL”);
s、 插入(“你好”);
wcout c_str()----构建已启动:项目:Test01,配置:调试Win32
------1>main.cpp 1>c:\program files(x86)\microsoft visual studio 11.0\vc\include\xutility(3171):错误C2678:二进制“==”:未找到接受“const”类型的左手操作数的运算符
std::basic_string'(或不可接受
转换)1>与1>[1>_Elem=char,
1> _Traits=std::char_Traits,1>
AOL=STD::分配器1 > 1 >可以是“内置C++操作符==(const char〔6〕,const char [6〕)”1>BR> c:\ProgramFiles(x86)\microsoft visual studio 11.0\vc\include\exception(488):或'bool std::operator==(const std::_exception_ptr&,const std:_exception_ptr&')1>
c:\ProgramFiles(x86)\microsoft visual studio 11.0\vc\include\exception(493):或'bool std::operator==(std:_Null_type,const std:_exception_ptr&')1>c:\program files(x86)\microsoft visual studio 11.0\vc\include\exception(499):或'bool std::operator==(const std::_exception\u ptr&,std:_Null\u type)'1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\system\u错误(419):或
'bool std::operator==(常数std::error\u code&,常数 std::error\u condition&)'1>c:\program files(x86)\microsoft visual studio 11.0\vc\include\system\u错误(427):或“bool” std::operator==(常数std::error\u条件&,常数std::error\u代码 &)'1>c:\program files(x86)\microsoft visual studio 11.0\vc\include\tuple(537):或'bool std::operator==(const std::tuple&,const std::tuple&)'1>尝试 匹配参数列表“(常量 std::basic_string,const char[6])'1>
使用1>[1>\u Elem=char,1>
_Traits=std::char\u Traits,1>\u Alloc=std::allocator 1>]1>c:\program files(x86)\microsoft visual studio 11.0\vc\include\xutility(3204):请参阅 对函数模板实例化'\u InIt'的引用 std::_Find,const char[6]>(_InIt,_InIt,_Ty(&))'正在使用1>编译1>
[1>
_InIt=std::_Tree\u unchecked\u const\u迭代器,std::分配器>>>, 1>
_Mytree=std::\u Tree\u val,std::分配器>>>, 1> _Ty=const char[6]1>]1>
d:\docs\programming\test01\test01\main.cpp(39):参见参考 函数模板实例化'\u InIt std::find,const char[6]>(_InIt,_InIt,_Ty(&))'正在使用1>编译1>
[1>
_InIt=std::\u Tree\u const\u迭代器,std::分配器>>, 1>
_Mytree=std::\u Tree\u val,std::分配器>>>, 1> _Ty=const char[6]1>] ======生成:0成功,1失败,0最新,0跳过==========


嗯,尝试将你的函子args更改为
bool操作符()(const string&lhs,const string&rhs)
。看看这是否有帮助。

std::find不以同样的方式使用自定义比较器。你需要重载
=
操作符

预期的行为如下所示。请检查引用

template<class InputIterator, class T>
  InputIterator find ( InputIterator first, InputIterator last, const T& value )
  {
    for ( ;first!=last; first++) if ( *first==value ) break;
    return first;
  }
行动计划。 确切的答案是,我忘了在includes中添加
标题。
字符串头包含外部(非成员)
std::String
比较函数,如
operator==
operatorStrange。添加适当的头等后,这对GCC适用。MVCPP11 STL实现(或编译器)似乎有问题…请发布完整的代码。
string
真的是
std::string
?要尝试的两件事:显式转换
“你好”
std::find
调用中的std::string。将您的functor传递到
std::find
调用。目前,您的functor不会在该调用中使用,它将使用
操作符==
。此外,您是否可以发布整个生成输出(似乎缺少一些附加诊断).@NathanErnst显式转换没有帮助。
std::find
始终使用
运算符==
。生成输出添加到原始帖子。
string const¶m
const string¶m
是相同的。但我遵循了您的建议,不幸的是没有任何更改:(谢谢Tom。请澄清:我是否可以在没有包装器代码的情况下定义
运算符==(string const&lhs,string const&rhs)
struct Foo {
    Foo(const std::string &s_) : s(s_) {}
    std::string s;
    // used by std::set<Foo, Foo::Less>::find
    struct Less {
        bool operator()(const Foo &lhs, const Foo &rhs) const {
            return lhs.s.compare(rhs.s) < 0;
        }
    };
};

// used by std::find
bool operator==(const Foo &lhs, const Foo &rhs) {
    return lhs.s.compare(rhs.s) == 0;
}

int main(int argc, char ** argv) {
    std::set<Foo, Foo::Less> foos;
    foos.insert(Foo("hello"));
    foos.insert(Foo("STL"));
    foos.insert(Foo("Hello"));

    std::cout << foos.find(Foo("Hello"))->s.c_str() << std::endl;
    std::cout << find(foos.begin(), foos.end(), Foo("Hello"))->s << std::endl;
    return 0;
}   
#include <algorithm>
#include <string>
bool operator==(const std::string &lhs, const std::string &rhs) {
    return lhs.compare(rhs) == 0;
}