【问题标题】:no matching function call to error in vector.push_backvector.push_back 中没有匹配的函数调用错误
【发布时间】:2021-11-20 15:04:15
【问题描述】:

编译我的 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 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));
}

这可能是什么原因?

【问题讨论】:

  • 您正在尝试推送一个指针(由new 返回),但看起来向量已初始化为使用对象。
  • 什么是类型变量vector_?我的意思是你是怎么定义的。你能告诉我们吗。上面给出的 sn-ps 中似乎没有 vector_ 的定义。
  • @JohnnyMopp,我添加了完整的代码。很抱歉造成混乱

标签: c++ g++


【解决方案1】:

您的向量被声明为存储 Record 类型的对象,而不是指向它们的指针 (Record *) 但您试图推送返回 Record *operator new 的结果,只需使用 std::vector::emplace_back 代替:

vector_.emplace_back(key, value);

注意:在这一行

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

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

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

【讨论】:

  • 我添加了完整的代码以避免任何混淆
  • @daniel 没有改变任何东西,我的回答仍然存在
  • 知道了。但是我可以做Record *record = new Record(key, value); 并做vector_.push_back(*record) 吗?可以吗?
  • @daniel 会编译,但你会创建一个不必要的副本并造成内存泄漏(除非你事后删除它,但仍然会让所有这些不必要的事情发生)
  • emplace_back 会自动转成记录并推入向量?
【解决方案2】:

问题是您的变量 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

【讨论】:

    猜你喜欢
    • 2013-05-05
    • 2012-12-28
    • 2015-03-31
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多