【问题标题】:Passing std vector as reference: no matching function to call传递标准向量作为参考:没有匹配的函数调用
【发布时间】:2014-02-26 19:56:15
【问题描述】:

我看不出我的代码有什么问题。我有一个 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,但我想这与此无关。

【问题讨论】:

  • 既然已经是会员了,为什么还要传给函数呢?顺便说一句,这是关于const
  • @billz,那里有两个类。
  • 也显示调用成员函数(我敢打赌它是const-qualified)。

标签: c++ vector


【解决方案1】:

您在DatabaseLoad 对象是const-qualified 的上下文中调用BackupTable 函数,因此编译器期望调用const-reference。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您似乎在一个限定为const 的成员函数中调用BackupTable(this-&gt;tableBackup);。这意味着thisconst Whatever* 类型,因此所有数据成员在此成员函数中也隐含地const 限定。因此它们不能绑定到非const 引用。

      你有两个明智的选择:

      1. 如果BackupTable 没有修改它的参数,它应该接受它作为const &amp; 而不仅仅是&amp;

      2. 如果它确实修改了它的参数,这意味着调用函数修改了它的this对象,所以它不应该被标记为const

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

      mutable std::mutex mutables;
      

      并在您访问(即使只是为了阅读!)可变成员时锁定mutables

      【讨论】:

      • 请注意,这个习语概括了 Java synchronized。所以你最好确保你没有在锁下调用任何未知代码,否则你最终遭受锁反转;-)
      【解决方案4】:

      我认为 'this' 在 'BackupTable(this->tableBackup);' 中是 const。您在“Foo() const”函数中调用“BackupTable”。

      【讨论】:

        猜你喜欢
        • 2017-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多