2013-12-07 6 views
0
'void std::vector<_Ty>::push_back(_Ty &&)' : cannot convert parameter 1 from 'const 
std::vector<_Ty>' to 'std::string &&' 
1>   with 
1>   [ 
1>    _Ty=std::string 
1>   ] 
1>   Reason: cannot convert from 'const std::vector<_Ty>' to 'std::string' 
1>   with 
1>   [ 
1>    _Ty=std::string 
1>   ] 
1>   No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 

мои личные выглядит так:Продолжайте получать сообщение об ошибке типа. Не уверен, что это значит и как это исправить

private: 
    map<string, vector<string> > mymap; 
}; 

и ошибка функции происходит, выглядит следующим образом:

void MiniSearch::NotFunction(const string q1, const string q2, vector<string>& ReturnVec) const 
{ 
    // checks for q1 and that q2 isnt in 
    if (mymap.find(q1) != mymap.end() && mymap.find(q2) == mymap.end()) 
    { 
     // q1 in map q2 not in map else return 
     const vector<string>& temp = mymap.find(q1)->second; 
     unsigned int i = 0; 
     for (std::vector<string>::const_iterator it = temp.begin(); it != temp.end(); ++it) 
     { 
      if (ReturnVec.empty()) 
       ReturnVec.push_back(*it); 

      else 
      if (i < ReturnVec.size() && ReturnVec[i] != *it) 
       ReturnVec.push_back(*it); 
      ++i;; 
     } 
    } 
    ReturnVec.push_back(mymap.find(q1)->second); // ERROR 
} 

Как это исправить ? Является ли моя карта не использующей правильные структуры данных? Я что-то пропустил наедине? То, как я написал код, логически делает, потому что для меня просто не понятно, почему он не работает.

+0

Вы пытаетесь 'push_back' весь вектор на' ReturnVec'? –

+0

У меня есть имена файлов (.txt), которые я хочу нажать на returnVec, после его завершения будут возвращены все документы, в которых находился определенный входной текст. –

ответ

0

В этом случае вы не хотите push_back, так как вы пытаетесь добавить один вектор в другой. Вместо этого, вы хотите что-то вроде этого:

ReturnVec.insert(ReturnVec.end(), mymap.find(q1)->second.begin(), mymap.find(q1)->second.end()); 

Отметим также, что все эти призывы к mymap.find(q1) и mymap.find(q2) собираются повторно выполнить поиск по карте, добавляя тонны циклов. Вы должны рассмотреть вопрос об объявлении итератор и выполнение find только один раз для каждого:

auto q1_it = mymap.find(q1); 
auto q2_it = mymap.find(q2); 

Или, если вы не можете сделать C++ 11:

map< string, vector<string> >::iterator q1_it = mymap.find(q1); 
map< string, vector<string> >::iterator q2_it = mymap.find(q2); 

Это должно дать вам заметный подъем производительности ,

Применяя эти итераторы мой ответ выше:

ReturnVec.insert(ReturnVec.end(), q1_it->second.begin(), q1_it->second.end()); 
Смежные вопросы