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

问题描述 投票:-2回答:2

我写了以下代码:

#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*的价值?

c++ stdmap
2个回答
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");

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

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

阅读此处的文档:

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

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

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
}

0
投票

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

因此解决方案是在使用std::map中的函数之前取消引用指针:

(*this->threadMap)["fkjk"];
© www.soinside.com 2019 - 2024. All rights reserved.