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;
}