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
。
编译我的 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
。