Индекс массива не является целым на карте

Я написал следующий код:

#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"];
Другие вопросы по тегам