嗨我在结构中有一个向量,如pthreads参数传递:
struct thread_data{
vector< pair < Database, string> > list_databases;
...
...
};
...some more code...
然后在以后的功能中执行以下操作 (mydata是传递给函数的thread_data) (条目是一对&lt;数据库,字符串&gt;)
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 :(得分:1)
list
是main
函数中的局部变量,因此当main
返回时(在return 0;
中的main
行),它会被销毁。您将此局部变量的地址传递给load_store
,您从另一个线程开始。如果load_store
在list
被销毁后尝试访问list
,则会发生错误。
您需要同步list
的访问权限,可能需要main
加入thread1
才能退出。
答案 1 :(得分:0)
mydata->list_databases.push_back(entry);
会失败,因为thread_data::list_databases
是vector<...>*
而不是vector<...>
。即,它是一个指针类型而不是类类型,正如您所看到的编译器错误所表明的那样。
mydata->list_databases->push_back(new_store);
应该有效,除非您需要#include <utility>
才能使用std::pair
。