Last Updated on 2022-01-05 by Clay
在使用 C++ 的標準模板函式庫(Standard Template Library, STL)時,若是在使用 deque 或 vector 新增元素時遇到以下錯誤:
No matching member function for call to 'push_back' error
這個錯誤是由於錯誤的請求對象所造成的,通常是錯誤地推入不符合宣告時所設定的資料型態。
重複錯誤
比方說我使用下方的程式碼來重複這個錯誤:
#include <vector>
#include <string>
using namespace std;
int main() {
// Init
vector<string> notes;
string sent = "Today is a nice day.";
// Push back
for (int i=0; i<sent.size(); ++i) {
notes.push_back(sent[i]);
}
return 0;
}
Output:
test.cpp:14:15: error: no matching member function for call to 'push_back'
notes.push_back(sent[i]);
錯誤發生的原因
而這又是因為 string 類別跟裡面的元素字元不同的緣故。我們可以使用以下程式碼來檢查資料型態:
#include <iostream>
#include <typeinfo>
#include <vector>
#include <string>
using namespace std;
int main() {
// Init
vector<string> notes;
string sent = "Today is a nice day.";
// Push back
printf("typeid(notes).name(): %s\n", typeid(sent).name());
printf("typeid(notes).name(): %s\n", typeid(sent[0]).name());
return 0;
}
Output:
typeid(notes).name(): NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE
typeid(notes).name(): c
可以看到,一個是 string 的類別,一個是基礎的資料型態 char。
修正方法其實很單純,不外乎就是宣告正確的資料型態、將資料轉換成我們宣告的資料型態。總之,資料型態要相符,才能正確地進行操作。
解決方法範例
方法一: 宣告正確的資料型態
#include <vector>
#include <string>
using namespace std;
int main() {
// Init
vector<char> notes;
string sent = "Today is a nice day.";
// Push back
for (int i=0; i<sent.size(); ++i) {
notes.push_back(sent[i]);
}
return 0;
}
方法二:將資料轉換成我們宣告的資料型態
#include <vector>
#include <string>
using namespace std;
int main() {
// Init
vector<string> notes;
string sent = "Today is a nice day.";
// Push back
for (int i=0; i<sent.size(); ++i) {
string s;
s.push_back(sent[i])
notes.push_back(s);
}
return 0;
}
References
- https://stackoverflow.com/questions/1287306/difference-between-string-and-char-types-in-c#:~:text=C%2B%2B%20strings%20can%20contain%20embedded,readable%20and%20easier%20to%20use.
- https://stackoverflow.com/questions/52734630/no-matching-member-function-for-call-to-push-back-error
References
- [已解決][C++] cannot pass non-trivial object of type 'std::__1::string' (aka 'basic_string, allocator >') to variadic function; expected type from format string was 'char *'
- [已解決] ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000000d4 at pc 0x0000003a4fa9 bp 0x7ffedf29d730 sp 0x7ffedf29d728 READ of size 4 at 0x6020000000d4 thread T0
- [C++] 使用 typeid() 確認變數資料型態