[英]Passing std vector as reference: no matching function to call
我看不出我的代码有什么问题。 我有一个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,但我想这与此无关。
您在DatabaseLoad
对象为const
限定的上下文中调用BackupTable
函数,因此编译器希望调用const
引用。
如果您不打算修改向量,则应将该函数声明为:
void BackupTable(const std::vector<std::string>& tableBackup);
我猜你是从Foo类的const方法调用BackupTable的
你似乎在调用BackupTable(this->tableBackup);
在一个成员函数里面,它被限定为const
。 这意味着, this
是类型的const Whatever*
,因此,所有的数据成员被隐式const
-qualified该成员函数内为好。 因此,它们不能绑定到非const
引用。
你有两个理智的选择:
如果BackupTable
不修改其参数,则应将其接受为const &
而不是just &
。
如果它确实修改了它的参数,则意味着调用函数修改了它的this
对象,因此它不应该被标记为const
。
第三种(更不可能)选项是tableBackup
实际上是类的实现细节,并且它更改的事实不会影响类的“逻辑const
”。 如果是这样,你可以将它标记为mutable
(这样,即使const
函数也能修改它)。 同时,每当访问mutable tableBackup
(或任何可变成员)时,都必须引入某种形式的同步机制(例如互斥锁)。 原因是所有标准库都期望const
操作是线程安全的。 一个新兴的成语是添加这样的私人成员:
mutable std::mutex mutables;
每当你访问(甚至只是为了阅读!)一个可变成员时锁定mutables
。
我认为'this'在'BackupTable(this-> tableBackup);'中是常量。 你在'Foo()const'函数中调用'BackupTable'。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.