2015-05-28 31 views
0

我試圖代碼序列化sparse_hash_map到文件的類型,但不知何故,只是沒有工作,迫使它告訴我此錯誤消息:有沒有什麼辦法可以將sparse_hash_map <char *, int>的類型序列化爲文件?

/usr/local/include/sparsehash/sparsetable:1763:13: error: no matching function for call to object of type 'CharPointerToIntSerializer'

if (!serializer(fp, &*it)) return false; 

     ^~~~~~~~~~ 

似乎mymap.serialize方法工作得很好,它是mymap2.unsirialize方法失敗,關於這個代碼下面的問題的任何想法?

#include <iostream> 
#include <sparsehash/sparse_hash_map> 
using google::sparse_hash_map;  // namespace where class lives by default 

using namespace std; 

#define SIZE 13 

struct CharPointerToIntSerializer { 
    bool operator()(FILE* fp, std::pair<char *, int>* value) const { 
    if (fread(value->first, SIZE, 1, fp) != 1) { 
     return false; 
    } 
    if (fread(&(value->second), sizeof(value->second), 1, fp) != 1) 
     return false; 
    return true; 
    } 

    // bool operator()(FILE* fp, const std::pair<const char *, int>& value) const { 
    bool operator()(FILE* fp, const std::pair<char *, int>& value) const { 
    for(int i = 0; i < SIZE; i++){ 
     if (fwrite(value.first + i, 1, 1, fp) != 1) 
    return false; 
    } 

    if (fwrite(&value.second, sizeof(value.second), 1, fp) != 1) 
     return false; 
    return true; 
    } 
}; 

int main(){ 
    sparse_hash_map<char*, int> old_map,new_map; 
    char *p1, *p2; 
    p1 = (char *) malloc(10); 
    p2 = (char *) malloc(10); 
    strcpy(p1, "hello"); 
    strcpy(p2, "world"); 
    old_map[p1] = 1; 
    old_map[p2] = 2; 

    FILE* fp = fopen("hashtable.txt", "w"); 
    old_map.serialize(CharPointerToIntSerializer(), fp); 
    cout << old_map[p1] << endl; 
    fclose(fp); 

    FILE* fp_in = fopen("hashtable.txt", "r"); 
    new_map.unserialize(CharPointerToIntSerializer(), fp_in); 
    fclose(fp_in); 
    assert(old_map == new_map); 
    cout << new_map[p2] << endl; 
} 
+1

這是什麼都與提升呢? – sehe

+0

對不起,一些遺留代碼,它已被刪除 – beanmoon

回答

0

稀疏圖的value_type是std::pair<K const, V>。所以,

bool operator()(FILE* fp, std::pair<char*, int>* value) const; 
bool operator()(FILE* fp, std::pair<char*, int> const& value) const; 

應該

bool operator()(FILE* fp, std::pair<char* const, int>* value) const; 
bool operator()(FILE* fp, std::pair<char* const, int> const& value) const; 

分別。

,編譯,對sparsehash 1.12(Ubuntu自帶的1.10打包!)

+0

我確實改變了我的代碼,正如你指出的那樣,它編譯了:)這裏很棒的工作。但是當我運行該程序時,它會顯示「Segmentation fault:11」錯誤,請問我的序列化方法有什麼問題嗎?嗯,真的讓我自己陷在這裏,謝謝你的幫助〜 – beanmoon

+0

是的。這裏有些不對勁。 (不要做原始指針,不要硬編碼魔術'SIZE'等等很難不寫這些東西的錯誤) – sehe

+0

我認爲嘗試反序列化映射時出了點問題,因爲映射關鍵字的類型是'char * const',在我們從序列化文件中將數據讀入映射之前,不能分配足夠的內存,因此會出現分段錯誤。 gdb調試結果也驗證了它。那麼無論如何要將數據讀入map.key(又名'char * const'類型)? – beanmoon

相關問題