Skip to content

[已解決][C++] No matching member function for call to ‘push_back’ error

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


References

Tags:

Leave a Reply