数组索引在地图上不是整数

时间:2018-01-02 11:01:35

标签: c++ stdmap

我写了以下代码:

#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 个答案:

答案 0 :(得分:3)

这里的问题有点微妙...... 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");

或者,您可以使用箭头语法直接调用括号运算符:

Task* t= this->threadMap->at("fkjk");

作为另一种选择,您可以使用stl map的命名方法而不是重载运算符:

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
}

阅读此处的文档:

http://www.cplusplus.com/reference/map/map/

这一切都说完了,我建议你使用STL map的find()方法返回一个迭代器,然后检查它的有效性,然后取消引用,取而代之的是:

long binaryW = Long.parseLong(W[i-15], 2);

答案 1 :(得分:0)

从第一个函数我猜this->threadMap是一个指针,因为你指定了另一个指针。这个猜测很好地符合错误信息。

因此,解决方案是在使用std::map

中的函数之前取消引用指针
(*this->threadMap)["fkjk"];