Error “no match operator[]” al introducir datos en un map dentro de un objeto – c++ map object

Pregunta:


Estoy tratando de guardar datos en un mapa dentro de un objeto y recibo este error en var[name]=val y en var[name]:

no match operator[]

header

#include <string>
#include <map>
using namespace std;

class Calculator{
public: 
    void addVal(string name, int val);
    int getVal(string name);
private:
    int memory;
    map <string,int>* var;
};

cpp

#include "Calculator.h"
#include <string>
#include <map>
using namespace std;

Calculator::Calculator():
memory(0), var(new map<string, int>)
{}
void Calculator::addVal(string name, int val){

    var[name]=val;

}

int Calculator::getVal(string name){
    return var[name];

}

¿Qué estoy haciendo mal?

Preguntado por: Diego Fernando Martinez

eferion

class Calculator{
private:
    map <string,int>* var;
//                  ^
};

Fíjate en ese asterisco… gracias a él, var es un puntero. Si el acceso al mapa se hace a través de un puntero tendrías que escribir algo tal que:

void Calculator::addVal(string name, int val){
    (*var)[name]=val;
}

Aunque también podrías hacer lo siguiente:

void Calculator::addVal(string name, int val){
    var->operator[](name)=val;
}

Aun así todo indica a que el error en tu caso es el uso del asterisco. Bórralo y entonces podrás acceder a los métodos del mapa sin problemas.

Como nota final, procura no hacer uso de using namespace en los ficheros de cabecera. En programas más grandes te puede dar problemas.

Tu código corregido luciría así:

class Calculator{
public: 
    void addVal(string name, int val);
    int getVal(string name);
private:
    int memory;
    map <string,int> var;
};

Calculator::Calculator()
  : memory(0)
{ }
void Calculator::addVal(string name, int val){
  var[name]=val;
}

int Calculator::getVal(string name){
  return var[name];
}

Si lo compilas, te da los errores:

  • Las funciones miembro addVal y getVal no tienen el retorno en la declaración mas si la tienen en la definición, así que el compilador no sabe identificarlas.
  • getVal está declarado con los parámetro (string, name) y definido con el parámetro (string name).
  • Defines el constructor de Calculator pero no lo declaras.
  • var es un puntero no un objeto, para usarlo deberías primero des-referenciar y luego usar: (*var)[name] = val y return (*var)[name].

Por cierto, no borras var en el destructor.

¿Has intentado compilar o entender los errores? Parecen bastante autoexplicativos.

Fuente

Tags:, ,

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *