C++ 传递std向量作为参考:没有要调用的匹配函数
我看不出我的代码有什么问题。我有一个std::vector,它是我的类Foo的私有成员。即使编译器给出的错误表明它是常量,它也不会被声明为常量 (在Foo.h) 此方法被保存到DatabaseLoad.cpp和.h中: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
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)。请注意,这个习惯用法重述了Javasynchronized
。因此,您最好确保不调用锁下的任何未知代码,否则最终会遇到锁反转;-)
mutable std::mutex mutables;