使用STD :: MAP时错误
Error while using std::map
在以下代码中,我试图了解地图查找如何与用户定义的数据一起用作键。
#include <iostream>
#include <map>
#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_io.hpp>
#include "unicode/coll.h"
using namespace std;
using namespace icu;
class mystring {
public:
std::string s;
bool operator==(const mystring &s1) const;
bool operator!=(const mystring &s) const;
bool operator<(const mystring &s1) const;
bool operator>(const mystring &s1) const;
bool operator<=(const mystring &s1) const;
bool operator>=(const mystring &s1) const;
};
int caseCompare(UnicodeString& str1, int32_t len1, UnicodeString& str2, int32_t len2)
{
int ret;
ret = str1.caseCompare(0, len1, str2, 0, len2, 0);
cout << "caseCompare: " << ret << endl;
return ret;
}
bool mystring::operator==(const mystring &s1) const
{
cout << "== operator" << "n";
cout << s << "t" << s1.s << "n";
UnicodeString us1(s.c_str(), s.length());
UnicodeString us2(s1.s.c_str(), s1.s.length());
if(caseCompare(us1, s.length(), us2, s1.s.length() != 0)) {
return 0;
}
return 1;
}
bool mystring::operator<(const mystring &s1) const
{
UnicodeString us1(s.c_str(), s.length());
UnicodeString us2(s1.s.c_str(), s1.s.length());
int ret;
cout << "< operator" << "n";
cout << s << "t" << s1.s << "n";
size_t smaller_size;
if (s.size() < s1.s.size()) {
smaller_size = s.size();
} else {
smaller_size = s1.s.size();
}
ret = caseCompare(us1, s.length(), us2, s1.s.length() != 0);
if(ret != 0) {
if (ret < 0) {
return 1;
} else {
return 0;
}
}
if ((s.size() == s1.s.size()) || (s.size() > s1.s.size())) {
return 0;
} else {
return 1;
}
}
bool mystring::operator!=(const mystring &s1) const
{
cout << "!= operator" << "n";
cout << s << "t" << s1.s << "n";
if (!(*this == s1)) {
return 1;
} else {
return 0;
}
}
bool mystring::operator>(const mystring &s1) const
{
cout << "> operator" << "n";
cout << s << "t" << s1.s << "n";
if ((!(*this < s1)) && (!(*this == s1))) {
return 1;
} else {
return 0;
}
}
bool mystring::operator<=(const mystring &s1) const
{
cout << "<= operator" << "n";
cout << s << "t" << s1.s << "n";
if ((*this < s1) || (*this == s1)) {
return 1;
} else {
return 0;
}
}
bool mystring::operator>=(const mystring &s1) const
{
cout << ">= operator" << "n";
cout << s << "t" << s1.s << "n";
if ((*this > s1) || (*this == s1)) {
return 1;
} else {
return 0;
}
}
typedef boost::tuple<class mystring, class mystring> Key;
int data = 100;
typedef std::map<Key, int, std::less<Key> > Testmap;
Testmap map1;
int main(void)
{
mystring str1;
mystring str2;
string str3, str4;
cout << "String1: " << endl;
cin >> str3;
cout << "String2: " << endl;
cin >> str4;
str1.s = str3;
str2.s = str4;
Key fk = boost::make_tuple(str1, str2);
map1.insert(std::make_pair(fk, data));
cout << "String1: " << endl;
cin >> str3;
cout << "String2: " << endl;
cin >> str4;
str1.s = str3;
str2.s = str4;
fk = boost::make_tuple(str1, str2);
Testmap::iterator itr = map1.find(fk);
if (itr != map1.end()) {
cout << itr->second << "n";
} else {
cout << "Not found";
}
return 0;
}
编译此代码时,我会收到此错误:
$ g++ map_test.cc -licuuc -licui18n
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/string:50,
from /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/locale_classes.h:42,
from /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/ios_base.h:43,
from /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/ios:43,
from /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/ostream:40,
from /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/iostream:40,
from map_test.cc:1:
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/stl_function.h: In member function ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = boost::tuples::tuple<mystring, mystring, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>]’:
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/stl_tree.h:1170: instantiated from ‘std::pair<typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key = boost::tuples::tuple<mystring, mystring, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>, _Val = std::pair<const boost::tuples::tuple<mystring, mystring, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>, int>, _KeyOfValue = std::_Select1st<std::pair<const boost::tuples::tuple<mystring, mystring, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>, int> >, _Compare = std::less<boost::tuples::tuple<mystring, mystring, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> >, _Alloc = std::allocator<std::pair<const boost::tuples::tuple<mystring, mystring, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>, int> >]’
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/stl_map.h:500: instantiated from ‘std::pair<typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator, bool> std::map<_Key, _Tp, _Compare, _Alloc>::insert(const std::pair<const _Key, _Tp>&) [with _Key = boost::tuples::tuple<mystring, mystring, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>, _Tp = int, _Compare = std::less<boost::tuples::tuple<mystring, mystring, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> >, _Alloc = std::allocator<std::pair<const boost::tuples::tuple<mystring, mystring, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>, int> >]’
map_test.cc:146: instantiated from here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/stl_function.h:230: error: no match for ‘operator<’ in ‘__x < __y’
我想它找不到<
运算符,但这是在class mystring
中定义的。还是抱怨缺乏分配方法?
谢谢!
只需包含 boost/tuple/tuple_comparison.hpp
根据您的要求,将比较操作员作为例子。
相关文章:
- C++将参数包传递给std::map导致错误C3245
- c++:[错误]"map"之前的预期初始值设定项
- 编译器错误 C2664 使用 std::map 和自定义类作为其值
- std::map 擦除 - 将迭代器传递给错误的映射
- 带有 std::map 的模板函数给出错误:变量或字段声明为 void
- 尝试 ptr->map.clear() 时出现分段错误
- 错误:与'operator='不匹配(操作数类型为"std::map<int、double>::iterator
- 使用std :: map时,包含unique_ptr的结构中的默认破坏者会导致编译错误
- 自动,错误:MAP ITERATOR没有名为“ First”的成员
- 将项目插入到std :: map时错误
- 由于从 std::map 派生的类中的 std::map 迭代器导致的内存错误
- 如何在<int>错误 C2338 中组织 map<set<multiset>,int> C++
- 在 std::map 中使用结构作为值时出现运行时错误
- map.insert:"Invalid arguments"错误与 pair<enum,vector<*>>
- SWIG:包装 std::map<key 时编译器错误,val *>
- 使用 std::map 时只读成员的错误递减
- 为什么缩小转换范围不能防止错误类型的map.insert()失败
- 错误 C2062:引用 std::map 时键入意外
- Qt nmake:错误 C3203:"map":非专用类模板不能用作模板参数"base"的模板参数,预期为真实类型
- 罗马数字基本算法中基于字符串的错误(使用std::map)