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

C++ 传递std向量作为参考:没有要调用的匹配函数,c++,vector,C++,Vector,我看不出我的代码有什么问题。我有一个std::vector,它是我的类Foo的私有成员。即使编译器给出的错误表明它是常量,它也不会被声明为常量 (在Foo.h) 此方法被保存到DatabaseLoad.cpp和.h中: public: void BackupTable(std::vector<std::string> &tableBackup); 公共: void BackupTable(标准::向量和表备份); 定义为: void DatabaseLoad::Backu

我看不出我的代码有什么问题。我有一个std::vector,它是我的类Foo的私有成员。即使编译器给出的错误表明它是常量,它也不会被声明为常量

(在Foo.h)

此方法被保存到DatabaseLoad.cpp和.h中:

public:
void BackupTable(std::vector<std::string> &tableBackup);
公共:
void BackupTable(标准::向量和表备份);
定义为:

void DatabaseLoad::BackupTable(std::vector<std::string> &tableBackup){
//whatever...
}
void DatabaseLoad::BackupTable(std::vector&tableBackup){
//不管怎样。。。
}
当我从Foo.cpp调用该方法时,出现以下错误:

BackupTable(this->tableBackup);
No matching function for call to 'DatabaseLoad::BackupTable(const std::vector<std::basic_string<char> > &)'
调用“DatabaseLoad::BackupTable(const std::vector&)”时没有匹配的函数

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

您正在调用
BackupTable
函数,而
DatabaseLoad
对象是
const
-限定的,因此编译器希望调用
const
-引用

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

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

我猜您正在从Foo类的const方法调用BackupTable

您似乎正在调用
BackupTable(this->tableBackup)在限定为
const
的成员函数内。这意味着
This
属于
const which*
类型,因此所有数据成员在该成员函数中也是隐式
const
-限定的。因此,它们不能绑定到非
const
引用

你有两个明智的选择:

  • 如果
    BackupTable
    没有修改它的参数,它应该接受它为
    const&
    ,而不仅仅是
    &

  • 如果它修改了它的参数,这意味着调用函数修改了它的
    this
    对象,因此它不应该被标记为
    const

  • 第三个选项(可能性要小得多)是
    tableBackup
    实际上是类的一个实现细节,它的更改不会影响类的“逻辑
    const
    属性”。如果是这样,您可以将其标记为
    mutable
    (这样,即使
    const
    函数也可以修改它)。同时,无论何时访问可变
    表备份
    (或任何可变成员),都必须引入某种形式的同步机制(例如互斥)。原因是所有标准库都希望
    const
    操作是线程安全的。一个新出现的习惯用法是添加一个私有成员,如下所示:

    mutable std::mutex mutables;
    

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

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

    既然它已经是成员了,为什么还要再次传递给函数?顺便说一句,它是关于
    const
    @billz的,这里有两个类。同时显示调用成员函数(我打赌它是
    const
    -qualified)。请注意,这个习惯用法重述了Java
    synchronized
    。因此,您最好确保不调用锁下的任何未知代码,否则最终会遇到锁反转;-)
    mutable std::mutex mutables;