结构中的矢量不会让我push_back

时间:2011-03-01 02:24:42

标签: c++ vector struct pthreads

嗨我在结构中有一个向量,如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;
}

2 个答案:

答案 0 :(得分:1)

listmain函数中的局部变量,因此当main返回时(在return 0;中的main行),它会被销毁。您将此局部变量的地址传递给load_store,您从另一个线程开始。如果load_storelist被销毁后尝试访问list,则会发生错误。

您需要同步list的访问权限,可能需要main加入thread1才能退出。

答案 1 :(得分:0)

正如您在问题中所示,

mydata->list_databases.push_back(entry);会失败,因为thread_data::list_databasesvector<...>*而不是vector<...>。即,它是一个指针类型而不是类类型,正如您所看到的编译器错误所表明的那样。

正如您在代码示例中所示,

mydata->list_databases->push_back(new_store);应该有效,除非您需要#include <utility>才能使用std::pair