Вектор в структуре не позволяет мне push_back - PullRequest
1 голос
/ 01 марта 2011

Привет, у меня есть вектор в структуре, как показано ниже для передачи аргумента pthreads:

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;
}

Ответы [ 2 ]

1 голос
/ 01 марта 2011

list является локальной переменной в функции main, поэтому она уничтожается при возврате main (в строке return 0; в main). Вы передаете адрес этой локальной переменной в load_store, который вы запускаете в другом потоке. Если load_store пытается получить доступ к list после уничтожения list, происходят плохие вещи.

Вам необходимо синхронизировать доступ к list, возможно, при main соединении с thread1 перед выходом.

0 голосов
/ 01 марта 2011

mydata->list_databases.push_back(entry);, как вы показали в своем вопросе, потерпит неудачу, потому что thread_data::list_databases - это vector<...>*, а не vector<...>.То есть это тип указателя, а не типа класса, как показывает ошибка компилятора, которую вы видите.

mydata->list_databases->push_back(new_store);, как вы показали в своем примере кода, должно работать, за исключением того, чтовам нужно #include <utility>, чтобы использовать std::pair.

...