2015-04-16 83 views
0

得到了很多錯誤,當錯誤的以下內容: g++ -std=c++11 delme.cc(源是從另一個SO問題採取)很多編譯C++編譯時涉及unordered_map

//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; 
} 
+0

所以基本上錯誤說:「別不匹配類型的'printf'」和「不使用指針非恆定的數據指向常量數據」 – chris

+1

你得到一個**錯誤* *消息還是你的意思是**警告**? –

+1

如果只是警告我建議刪除'printf'的用法並使用'std :: cout'。 –

回答

2

delme.cc:44:49:警告:格式 '%d' 需要類型 '詮釋' 的說法,但參數2的類型爲...

這不是一個錯誤這是一個警告,它表明%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"; 
+0

謝謝,那幫忙! – packetie