编译涉及 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 适用于类型 intunordered_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";