gpt4 book ai didi

c++ - 编译涉及unordered_map的c++时出现很多错误

转载 作者:行者123 更新时间:2023-11-28 02:28:39 25 4
gpt4 key购买 nike

编译时出现了很多错误:g++ -std=c++11 delme.cc(源码取自另一个SO问题)

//delme.cc
#include<unordered_map>
#include <iostream>
#include <string.h>
#include <functional>
//using namespace std;

struct my_equal_to : public std::binary_function<char*, char*, bool> {
bool operator()(char* __x, char* __y)
{ return strcmp( __x, __y ) == 0; }
};


struct Hash_Func{
//BKDR hash algorithm
int operator()(char * str)const
{
int seed = 131;//31 131 1313 13131131313 etc//
int hash = 0;
while(*str)
{
hash = (hash * seed) + (*str);
str ++;
}

return hash & (0x7FFFFFFF);
}
};

//typedef unordered_map<char*, unsigned int, Hash_Func, my_equal_to> my_unordered_map;

int main(){
//my_unordered_map location_map;
std::unordered_map<char*, unsigned int, Hash_Func, my_equal_to> location_map;
//my_equal_to location_map;
char *p;
char a[10] = "ab"; p = a;
location_map.insert(std::pair<char*, unsigned int>(p, 10));
char b[10] = "abc"; p = b;
location_map.insert(std::pair<char*, unsigned int>(p, 20));

char c[10] = "abc"; p = c;
location_map.insert(std::pair<char*, unsigned int>(p, 20));

printf("map size: %d\n", location_map.size());
std::unordered_map<char*, unsigned int, Hash_Func, my_equal_to>::iterator it;
if ((it = location_map.find("abc")) != location_map.end())
{
printf("found!\n");
}

return 0;
}

错误信息太长,这里是其中的一部分

delme.cc: In function ‘int main()’:
delme.cc:44:49: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘std::_Hashtable<char*, std::pair<char* const, unsigned int>, std::allocator<std::pair<char* const, unsigned int> >, std::_Select1st<std::pair<char* const, unsigned int> >, my_equal_to, Hash_Func, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, true, false, true>::size_type {aka long unsigned int}’ [-Wformat]
delme.cc:46:38: warning: deprecated conversion from string constant to ‘std::_Hashtable<char*, std::pair<char* const, unsigned int>, std::allocator<std::pair<char* const, unsigned int> >, std::_Select1st<std::pair<char* const, unsigned int> >, my_equal_to, Hash_Func, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, true, false, true>::key_type {aka char*}’ [-Wwrite-strings]
In file included from /usr/include/c++/4.7/bits/hashtable.h:36:0,
from /usr/include/c++/4.7/unordered_map:46,
from delme.cc:1:
/usr/include/c++/4.7/bits/hashtable_policy.h: In instantiation of ‘static bool std::__detail::_Equal_helper<_Key, _Value, _ExtractKey, _Equal, _HashCodeType, true>::_S_equals(const _Equal&, const _ExtractKey&, const _Key&, _HashCodeType, std::__detail::_Hash_node<_Value, true>*) [with _Key = char*; _Value = std::pair<char* const, unsigned int>; _ExtractKey = std::_Select1st<std::pair<char* const, unsigned int> >; _Equal = my_equal_to; _HashCodeType = long unsigned int]’:
/usr/include/c++/4.7/bits/hashtable_policy.h:887:23: required from ‘bool std::__detail::_Hashtable_base<_Key, _Value, _ExtractKey, _Equal, _H1, _H2, _Hash, __cache_hash_code>::_M_equals(const _Key&, std::__detail::_Hashtable_base<_Key, _Value, _ExtractKey, _Equal, _H1, _H2, _Hash, __cache_hash_code>::_Hash_code_type, std::__detail::_Hash_node<_Value, __cache_hash_code>*) const [with _Key = char*; _Value = std::pair<char* const, unsigned int>; _ExtractKey = std::_Select1st<std::pair<char* const, unsigned int> >; _Equal = my_equal_to; _H1 = Hash_Func; _H2 = std::__detail::_Mod_range_hashing; _Hash = std::__detail::_Default_ranged_hash; bool __cache_hash_code = true; std::__detail::_Hashtable_base<_Key, _Value, _ExtractKey, _Equal, _H1, _H2, _Hash, __cache_hash_code>::_Hash_code_type = long unsigned int]’
...

有什么想法吗?

g++ (v.4.7.3) 在 Ubuntu 12.04 上运行。

更新 1

根据对这个问题的建议,这里是工作的。用于编译的命令是:g++ -std=c++11 -fpermissive delme.cc

#include<unordered_map>
#include <iostream>
#include <string.h>
#include <functional>
//using namespace std;

struct my_equal_to : public std::binary_function<char*, char*, bool> {
bool operator()(char* __x, char* __y)
{ return strcmp( __x, __y ) == 0; }
};


struct Hash_Func{
//BKDR hash algorithm
int operator()(char * str)const
{
int seed = 131;//31 131 1313 13131131313 etc//
int hash = 0;
while(*str)
{
hash = (hash * seed) + (*str);
str ++;
}

return hash & (0x7FFFFFFF);
}
};

//typedef unordered_map<char*, unsigned int, Hash_Func, my_equal_to> my_unordered_map;
char big[0x10001];
int main(int argc, char *argv[]){
//my_unordered_map location_map;
std::unordered_map<char*, unsigned int, Hash_Func, my_equal_to> location_map;
//my_equal_to location_map;
char cmd[100];
char *p;
int i;
for (i=0; i<0x10000; i++) big[i] = 'a';
char a[10] = "ab"; p = a;
for (i=0; i<0x100; i++) {
big[i] = 'b';
location_map[big] = i;
}
std::cout << "map size: " << location_map.size() << "\n";
//printf("map size: %d\n", location_map.size());
printf("result: %d\n", location_map[argv[1]]);
gets(cmd);
return 0;
}

最佳答案

delme.cc:44:49: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ...

这不是一个错误,它是一个警告,它声明 %dint 类型,但是 unordered_map::size 不返回 int

在我看来,对这种打印使用类型安全操作会更好。例如。

// This works correctly regardless of the type returned by size(), assuming
// the type is supported by operator<<
std::cout << "map size: " << location_map.size() << "\n";

关于c++ - 编译涉及unordered_map的c++时出现很多错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29664449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com