2011-03-01 38 views
1

嗨,我有一個載體,一個結構的並行線程參數傳遞如下:向量的結構不會讓我的push_back

struct thread_data{ 
    vector< pair < Database, string> > list_databases; 
    ... 
    ... 
}; 

...some more code... 

然後在後面的功能,當我做了以下 (MYDATA是thread_data傳遞進入功能) (條目是一對<數據庫,字符串>)

mydata->list_databases.push_back(entry); 

每當我做到這一點告訴我的push_back非類類型。我不明白這個錯誤。

vector< pair<Database,string> > * list_databases; 

mydata->list_databases->push_back(entry); 

以及兩者的組合:用我也嘗試過。所有給我同樣的錯誤。任何人都可以提出建議我已經研究過這個問題,並且已經停留了好幾個小時。謝謝

編輯:

這裏是代碼的其餘部分:

#include<iostream> 
#include<pthread.h> 
#include<vector> 
#include<string> 
#include<fstream> 

using namespace std; 

struct thread_data{ 
    vector< pair<Database, string> >* list_databases; 
    const char* store; 
} 

void* load_store(void* threadarg); 

int main(){ 
    vector< pair <Database, string> > list; 
    pthread_t thread1; 
    string test; 
    cout <<"$ "; 
    cin >> test; 

    const char* store_name = test.c_str(); 

    struct thread_data tester; 
    tester.store = store_name; 
    tester.list_databases = &list; 

    pthread_create(&thread1,NULL,load_store, (void*) &tester); 
    return 0; 
} 

void * load_store(void* threadarg){ 
    struct thread_data *mydata; 
    mydata = (struct thread_data*) threadarg; 
    string store_used = mydata->store; 

    ifstream load; 
    string conversion; 
    Database Loader; 
    load.open(store_used.c_str()); 

    if(!load){ cerr << "Does not exist" << endl; 
    exit(1); 
    } 

    while(!load.eof()){ 
    //...pushes file contents into database Loader... 
    } 
    load.close(); 
    pair < Database, string > new_store(Loader, store); 
    mydata->list_databases->push_back(new_store);  // this is where the error occurs 
return 0; 
} 
+0

請從包含'thread_data'的文件中發佈代碼的相關聲明,包括'#includes','using'語句等。 – birryree

+0

我發佈了其餘的相關代碼 – aport002

回答

0

mydata->list_databases.push_back(entry);,正如您在問題中所顯示的,將會失敗,因爲thread_data::list_databasesvector<...>*而不是vector<...>。也就是說,它是一個指針類型而不是類類型,就像你看到的編譯器錯誤所指示的那樣。

mydata->list_databases->push_back(new_store);,正如您在代碼示例中所示,應該可以工作,除了您需要#include <utility>才能使用std::pair

+0

這很好用。我完全忘了添加實用程序和關於指針類型。我在最初的錯誤上使用了很多組合,我無法相信我錯過了這一個。謝謝 – aport002

1

listmain函數中的局部變量,因此它被摧毀時main返回(在該return 0;main)。您將此局部變量的地址傳遞給load_store,您可以從另一個線程開始。如果load_storelist被銷燬後嘗試訪問list,則會發生不良情況。

您需要同步對list的訪問,可能是因爲main在退出之前連接了thread1