因此,对于学校的任务,我们必须将Linear Hashing实现为一个类,该类派生自包含指向块列表类的唯一指针的向量。
现在每当我尝试使用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,但是在做算法的过程中却把它扔进去,这让我很难理解这一点。
答案 0 :(得分: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)));
}