Индекс массива не является целым на карте
Я написал следующий код:
#include "joinCommand.h"
joinCommand::joinCommand(map<string, Task *>* threadMap) {
this->threadMap=threadMap;
}
string joinCommand::execute(vector<string> args) {
if(threadMap->count(&args.at(1)) ==1){
Task* t= this->threadMap["fkjk"];
}
}
Компилятор выдает сообщение об ошибке для следующей строки:
Task* t= this->threadMap["fkjk"];
Сообщение об ошибке:
Индекс массива не является целым числом.
Как я должен получить значение Task*
с карты?
2 ответа
Проблема здесь немного тонкая... threadMap
доступен this->threadMap
, но это также указатель. Тип this->threadMap
является map<string, Task *> *
не map<string, Task *>
поэтому, когда вы делаете []
оператор на него, он действует на указатель, а не на разыменованный объект.
Вам нужно сделать это:
Task* t= (*this->threadMap)["fkjk"];
Более подробно:
Task* t= (*(this->threadMap))["fkjk"];
В качестве альтернативы вы можете напрямую вызвать оператор скобок с помощью синтаксиса стрелки:
Task* t= this->threadMap->operator[]("fkjk");
В качестве другой альтернативы вы можете использовать именованные методы stl map вместо перегруженных операторов:
Task* t= this->threadMap->at("fkjk");
Прочитайте документацию здесь:
http://www.cplusplus.com/reference/map/map/
После того, как все это сказано и сделано, я предлагаю вам использовать метод find () карты STL, чтобы вернуть итератор, и проверить его на валидность, а затем разыменовать что-то вроде этого:
map<string, Task*>::iterator it = this->threadMap->find(&args.at(1));
if (it != this->threadMap->end()) {
Task *t = *it; // or just directly use *it or it->
// continue to use the valid 't' pointer
}
По первой функции, я думаю, this->threadMap
является указателем, потому что вы назначаете другой указатель на него. Это предположение хорошо соответствует сообщению об ошибке.
Таким образом, решение заключается в разыменовании указателя перед использованием функций из std::map
:
(*this->threadMap)["fkjk"];