[英]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.