将STD向量作为参考:无匹配函数要呼叫

Passing std vector as reference: no matching function to call

本文关键字:无匹配 函数 呼叫 参考 STD 向量      更新时间:2023-10-16

我看不出我的代码有什么问题。我有一个std :: vector,这是我班级的私人成员。即使编译器给出建议的错误,也没有声明为const。

(在foo.h)

private:
std::vector<std::string> tableBackup;

我正在调用函数(来自foo.cpp):

BackupTable(this->tableBackup);

此方法已进入databaseload.cpp和.h:

public:
void BackupTable(std::vector<std::string> &tableBackup);

定义为:

void DatabaseLoad::BackupTable(std::vector<std::string> &tableBackup){
//whatever...
}

从foo.cpp调用该方法时,我会遇到以下错误:

No matching function for call to 'DatabaseLoad::BackupTable(const std::vector<std::basic_string<char> > &)'

有什么问题?当前使用C 11,但我想这与此无关。

您在DatabaseLoad对象为const的上下文中调用BackupTable函数,因此编译器期望呼叫const -Reference。

如果您不打算修改向量,则应将函数声明为:

void BackupTable(const std::vector<std::string>& tableBackup);

我可以猜想您是从foo class的const方法呼叫

您似乎在符合const的成员函数中调用BackupTable(this->tableBackup);。这意味着this是类型const Whatever*,因此所有数据成员在此成员函数中也隐含地 const合格。因此它们不能绑定到非const参考。

您有两个理智的选择:

  1. 如果BackupTable不修改其参数,则应接受它为const &,而不是&

  2. 如果它确实修改了其参数,则表示调用函数修改其this对象,因此不应将其标记为const

第三个选项是tableBackup实际上是您类的实现详细信息,并且它更改的事实不会影响类的"逻辑const NESS"。如果是这样,您可以将其标记为mutable(这样,即使const功能也可以对其进行修改)。同时,每当您访问可变的tableBackup(或任何可突变的成员)时,您必须必须引入某种形式的同步机制(例如mutex)。原因是所有标准库都期望const操作是线程安全。一个新兴的成语正在添加这样的私人成员:

mutable std::mutex mutables;

和锁定mutables访问时(甚至只是为了阅读!)。

我认为'this'在'接头(this-> tablebackup);'中是const。您在" foo()const"函数中称为"可触发"。