es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error de conversión incompatible al asignar, aunque lo capturo con una instrucción if en C++11.

template <typename t=""> using Map = std::map<std::string, t="">;
class object_index {
public:
  object_index(){};
  int cntr = 0;
  Map<int> MapInt;
  Map<bool> MapBool;
  Map<std::string> MapStr;
  Map<double> MapDouble;
  template <typename v=""> void insert2Map(V lhs) {
    if (std::is_same<v, int="">::value) {
      std::cout << "INT: ";
      std::string key = std::to_string(cntr);
      MapInt[key] = lhs; // ERROR 
/* conversión incompatible de puntero a entero. 
Se intenta asignar a 'std::map<><><char>>, int>::mapped_type' (es decir, 'int') 
desde 'const char *' */
    }
    if (std::is_same<v, const="" char="" *="">::value) {
      std::cout << "STR: ";
    }

if (std::is_same<v, bool="">::value) {
  std::cout << "BOOL: ";
}

if (std::is_same<v, double="">::value) {
  std::cout << "DOUBLE: ";
}

std::cout << lhs << std::endl;
}

}
template <typename ob=""> object_index &operator,(Ob obj) {
insert2Map(obj);
++cntr;
return *this;
}
// o1[valores 1.3, 2, 4, "hola"];
};

class object {
public:
void operator[](object_index index) { item = index; }

private:
object_index item;
};

<h1>definir valores object_index(),</h1>

int main(void) {

object o1 = object();
o1[valores 1.3, 2, true, "hola"];

return 0;
}

DESCARGO DE RESPONSABILIDAD: Sé que no hay razón para usar esta sintaxis extraña, es para un proyecto universitario que lo solicita.

Nunca debería recibir un argumento de un tipo incompatible, lo verifico antes de usarlo. ¿Cómo puedo solucionar esto? ¿O el compilador tiene razón? ¿Cómo puedo lograrlo correctamente?</v,></v,></v,></v,></std::string,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El error del compilador indica que se está asignando una clave de tipo string a un valor de tipo entero en el mapa MapInt, lo cual no es compatible. Esto sucede porque el parámetro lhs que se pasa a insert2Map es de tipo const char* cuando V es int.

    Para evitar este error, puedes agregar una verificación adicional para const char* en la condición is_same y convertir el parámetro lhs a int usando std::stoi antes de asignarlo al mapa. De esta manera, cualquier valor de string que se pase como entero será convertido a un valor entero real.

    La función insert2Map modificada se vería así:

    template <typename v="">
    void insert2Map(V lhs) {
      if (std::is_same<v, int="">::value) {
        std::cout << "INT: ";
        std::string key = std::to_string(cntr);
        int value = std::stoi(lhs);
        MapInt[key] = value;
      }
    
      if (std::is_same<v, const="" char*="">::value) {
        std::cout << "STR: ";
      }
    
      if (std::is_same<v, bool="">::value) {
        std::cout << "BOOL: ";
      }
    
      if (std::is_same<v, double="">::value) {
        std::cout << "DOUBLE: ";
      }
    
      std::cout << lhs << std::endl;
    }
    

    Con esta modificación, la función manejará correctamente los valores enteros pasados como strings sin producir el error de conversión de puntero incompatible a entero.</v,></v,></v,></v,>

Comments are closed.