2015-10-16 90 views
0

因此,對於學校的任務,我們必須將Linear Hashing實現爲一個類,該類從包含指向塊列表類的唯一指針的向量派生。擴展向量並調用push_back函數

現在,無論何時我嘗試使用push_back添加元素,我都會得到:No matching member function for call to 'push_back'。但是,當我嘗試運行this->size()它確實有效。

我的代碼:

template <class Key, class Data> 
class Linhash : public std::vector<std::unique_ptr<Blocklist<Key, Data>>> { 
public: 
    Linhash<Key, Data>(Disk<Block<Key, Data>>* disk) 
    : std::vector<std::unique_ptr<Blocklist<Key, Data>>>() { 
     this->disk = disk; 
    } 

    void add(Key k, Data d); 
}; 

template <class Key, class Data> 
void Linhash<Key, Data>::add(Key k, Data d) { 
    // This works 
    this->size(); 

    // This doesn't work 
    Blocklist<Key, Data> bl(this->disk); 
    this->push_back(bl); 
} 

我的選擇將是,我推錯了對象到的push_back功能(它有什麼做的unique_ptr的),但我不知道。此外,我們並沒有在我們的課程中學習unique_ptr,而是在執行算法時拋出它,這讓我很難理解這一點。

+2

你有一種類型的矢量('標準::的unique_ptr <阻止列表<...>>'),但你想'push_back'不同類型的值( 'Blocklist <...>') –

+0

您是否試圖將該列表包裝在唯一的指針中? – ChiefTwoPencils

+0

因此,我將不得不單獨創建一個unique_ptr對象,編輯:好吧,imma試試,編輯#2:工作,非常感謝你! –

回答

1

正如Igor Tandetnik所指出的那樣,我只是將它包裝在一個unique_ptr對象中,並且這樣做。

所以工作代碼:

template <class Key, class Data> 
class Linhash : public std::vector<std::unique_ptr<Blocklist<Key, Data>>> { 
public: 
    Linhash<Key, Data>(Disk<Block<Key, Data>>* disk) 
    : std::vector<std::unique_ptr<Blocklist<Key, Data>>>() { 
     this->disk = disk; 
    } 

    void add(Key k, Data d); 
}; 

template <class Key, class Data> 
void Linhash<Key, Data>::add(Key k, Data d) { 
    // This works 
    this->size(); 

    // This doesn't work 

    this->push_back(std::unique_ptr<Blocklist<Key, Data>>(new Blocklist<Key, Data>(this->disk))); 
}