传递std向量作为参考:没有匹配的函数来调用

时间:2014-02-03 10:58:29

标签: c++ vector

我无法查看我的代码有什么问题。我有一个std :: vector,它是我的类Foo的私有成员。它不会被声明为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,但我想这与此无关。

4 个答案:

答案 0 :(得分:3)

您正在BackupTable对象DatabaseLoad限定的上下文中调用const函数,因此编译器期望调用const - 引用。

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

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

答案 1 :(得分:2)

我猜你是从Foo类的const方法调用BackupTable

答案 2 :(得分:1)

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

你有两个理智的选择:

  1. 如果BackupTable未修改其参数,则应将其视为const &,而不仅仅是&

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

  3. 第三种(更不可能)选项是tableBackup实际上是类的实现细节,并且它更改的事实不会影响类的“逻辑const ness”。如果是这样,您可以将其标记为mutable(这样,即使const函数也可以修改它。同时,只要您访问mutable tableBackup(或任何可变成员),必须引入某种形式的同步机制(例如互斥锁)。原因是所有标准库都希望const操作是线程安全的。一个新兴的成语是添加这样的私人成员:

    mutable std::mutex mutables;
    

    每当您访问(甚至只是为了阅读!)一个可变成员时锁定mutables

答案 3 :(得分:1)

我认为'this'在'BackupTable(this-&gt; tableBackup);'中是常量。你在'Foo()const'函数中调用'BackupTable'。