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 inesperado en la comparación de iteradores de unordered_map

Tengo un mapa simple std::map<string,></string,>namespace::MyType>, estoy utilizando c++11, así que lo reemplacé con unorderedmap por razones de rendimiento. Obtengo el siguiente error al comparar un iterador con end().


auto cit = str_map_.find(str);
if (cit != str_map_.end()) {
...
}

En la instanciación de ‘bool mynamespace::operator!=(const T1&, const T2&) [con T1 = std::detail::Nodeiterator<>cxx11::basicstring, mynamespace::MyType, false, true>; T2 = std::detail::Nodeiterator<>cxx11::basicstring, my_namespace::MyType, false, true>>]’: no hay una función coincidente …

Lo depuré hasta mis operadores de comparación bastante creativos para mynamespace::MyType:

template
struct MyType {
T* mt
;
};

struct MyTempClass {
std::string mtc_;

static int Compare(MyType<MyTempClass> const& lhs, MyType<MyTempClass> const& rhs) {
    return lhs.mt_->mtc_.compare(rhs.mt_->mtc_);
}

static int Compare(std::string const& lhs, MyType<MyTempClass> const& rhs) {
    return lhs.compare(rhs.mt_->mtc_);
}

static int Compare(MyType<MyTempClass> const& lhs, std::string const& rhs) {
    return lhs.mt_->mtc_.compare(rhs);
}

};

template
bool operator !=(T1 const& lhs, T2 const& rhs) {
int res = MyTempClass::Compare(lhs, rhs);
return (res != 0);
}

template
bool operator ==(T1 const& lhs, T2 const& rhs) {
int res = MyTempClass::Compare(lhs, rhs);
return (res != 0);
}

static std::unorderedmap<std::string, mytype<mytempclass>=””> my</std::string,>map;

Pero todavía estoy desconcertado por qué sucedió: el mismo código funciona bien con un mapa normal, ¿y el tipo de valores no debería estar involucrado en las comparaciones de iteradores?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que no hay una función coincidente para el operador !=, lo cual indica que puede haber un problema con el/los operador(es) de comparación definidos para my_namespace::MyType. En este caso, resulta que el problema es causado por tres funciones de comparación personalizadas que dependen del tipo de plantilla T, el cual no está definido explícitamente para las funciones. Esto puede llevar a inconsistencias en las comparaciones de iteradores, especialmente con el cambio de std::map a std::unordered_map. Por lo tanto, se recomienda definir explícitamente las funciones de comparación para cada especialización de plantilla o proporcionar una especialización de plantilla para el tipo T.

Comments are closed.