vector.push_back 中没有匹配的函数调用错误

no matching function call to error in vector.push_back

编译我的 C++ 程序时出现以下错误:

error: no matching function for call to 'std::vector<ChainingTable<int>::Record, std::allocator<ChainingTable<int>::Record> >::push_back(ChainingTable<int>::Record*)'
  324 |         vector_.push_back(new Record(key, value));

错误来自行:

template <class TYPE>
bool ChainingTable<TYPE>::update(const std::string &key, const TYPE &value)
{
    if (!keyExists)
        {
            vector_.push_back(new Record(key, value));
        }
}

这是为class定义的:

class ChainingTable : public Table<TYPE>
{
    struct Record
    {
        TYPE data_;
        std::string key_;
        Record(const std::string &key, const TYPE &data)
        {
            key_ = key;
            data_ = data;
        }
    };

    std::vector<std::vector<Record>> records_;
    int capacity_; // capacity of the array

完整代码:

int sz = numRecords();
bool rc = true;
std::hash<std::string> hashFunction;
size_t hash = hashFunction(key);
size_t idx = hash % capacity_;
std::vector<Record> vector_ = records_[idx];
bool keyExists = false;
for (int i = 0; i < vector_.size(); i++)
{
    if (vector_[i].key_ == key)
    {
        vector_[i].data_ = value;
        keyExists = true;
    }
}
if (!keyExists)
{
    vector_.push_back(new Record(key, value));
}

这可能是什么原因?

你的向量被声明为存储 Record 类型的对象,而不是指向它们的指针 (Record *) 但你正试图推送 operator new 的结果 returns Record *,直接用std::vector::emplace_back代替:

vector_.emplace_back(key, value);

注意:在这一行

std::vector<Record> vector_ = records_[idx];

你创建了一个副本,然后修改它,看来你需要一个参考。

注意2:在你的搜索循环中,即使你已经找到对象,你也不会终止,你应该在if语句中添加break,这样会更有效。

问题 是您的变量 vector_ 持有类型 Record 的对象,但是当您写:

vector_.push_back(new Record(key, value));

您试图在向量 vector_ 中添加指向 Record 对象的指针,而不是添加 Record 对象本身。

你可以通过写解决它:

vector_.emplace_back(key, value);

备选方案

请注意,还有另一种可能的解决方案:

vector_.push_back(Record(key, value));

但最好使用 emplace_back