编译涉及 unordered_map 的 c++ 时出现很多错误
Lots of errors when compiling c++ involving unordered_map
编译以下内容时出现大量错误:
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
根据对这个问题的建议,这里是 working 一个。
用于编译的命令是: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 ...
这不是 错误 这是一个警告,它说明 %d
适用于类型 int
但 unordered_map::size
不是return 一个 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";
编译以下内容时出现大量错误:
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
根据对这个问题的建议,这里是 working 一个。
用于编译的命令是: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 ...
这不是 错误 这是一个警告,它说明 %d
适用于类型 int
但 unordered_map::size
不是return 一个 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";