unarios tipos sobrecarga programacion operadores logicos expresiones definicion c++ templates map const-correctness

tipos - sobrecarga de operadores unarios en c++



binario ''['': no se encontró ningún operador que tome un operando de la izquierda del tipo ''const std:: map<_Kty,_Ty>'' (2)

Si bien no es el caso anterior, ocurrirá el mismo problema si utiliza el operador [] en una función const.

No sé de dónde viene el error. Parece que estoy pasando datos válidos al operador [].

template <class VertexType> typename map< Vertex<VertexType>, int >::iterator Graph<VertexType>::findEdge( const VertexType& v, const VertexType& w ) const { map<Vertex<VertexType>, int>::const_iterator iter = vertices[v].second.adjList.find(w); return iter; } // end findEdge

El error:

error C2678: binary ''['' : no operator found which takes a left-hand operand of type ''const std::map<_Kty,_Ty>'' (or there is no acceptable conversion) 1> with 1> [ 1> _Kty=unsigned int, 1> _Ty=Vertex<unsigned int> 1> ] 1> c:/program files (x86)/microsoft visual studio 10.0/vc/include/map(164): could be ''Vertex<VertexType> &std::map<_Kty,_Ty>::operator [](unsigned int &&)'' 1> with 1> [ 1> VertexType=unsigned int, 1> _Kty=unsigned int, 1> _Ty=Vertex<unsigned int> 1> ] 1> c:/program files (x86)/microsoft visual studio 10.0/vc/include/map(209): or ''Vertex<VertexType> &std::map<_Kty,_Ty>::operator [](const unsigned int &)'' 1> with 1> [ 1> VertexType=unsigned int, 1> _Kty=unsigned int, 1> _Ty=Vertex<unsigned int> 1> ] 1> while trying to match the argument list ''(const std::map<_Kty,_Ty>, const unsigned int)'' 1> with 1> [ 1> _Kty=unsigned int, 1> _Ty=Vertex<unsigned int> 1> ] 1> c:/users/user/desktop/cs m20a/topic g project 2/topic g project 2/graph.h(146) : while compiling class template member function ''std::_Tree_iterator<_Mytree> Graph<VertexType>::findEdge(const VertexType &,const VertexType &) const'' 1> with 1> [ 1> _Mytree=std::_Tree_val<std::_Tmap_traits<Vertex<unsigned int>,int,std::less<Vertex<unsigned int>>,std::allocator<std::pair<const Vertex<unsigned int>,int>>,false>>, 1> VertexType=unsigned int 1> ] 1> c:/users/user/desktop/cs m20a/topic g project 2/topic g project 2/graph.h(52) : while compiling class template member function ''Graph<VertexType>::Graph(unsigned int)'' 1> with 1> [ 1> VertexType=unsigned int 1> ] 1> c:/users/user/desktop/cs m20a/topic g project 2/topic g project 2/topicg.cpp(17) : see reference to class template instantiation ''Graph<VertexType>'' being compiled 1> with 1> [ 1> VertexType=unsigned int 1> ]

Y la clase de Graph :

template <class VertexType> class Graph { private: // list of all vertices in the graph. assumes non-duplicate data. map< VertexType, Vertex<VertexType> > vertices; const unsigned MAX_VERTICES; // Maximum number of vertices the graph can hold. unsigned numVertices; /** Current number of vertices in the graph. */ unsigned numEdges; /** Number of edges in the graph. */ typename map< Vertex<VertexType>, int >::iterator findEdge( const VertexType& v, const VertexType& w ) const; public: Graph( unsigned max ); unsigned getNumVertices() const; unsigned getMaxNumVertices() const; unsigned getNumEdges() const; int getWeight( const VertexType& v, const VertexType& w ) const; Graph<VertexType>& addVertex( const VertexType& newValue ); Graph<VertexType>& addEdge( const VertexType& v, const VertexType& w, int weight ); void removeEdge( const VertexType& v, const VertexType& w ); void BFS( const VertexType& v ) const; void display() const; }; // end Graph


operator[] solo se puede llamar en un mapa no const .

Si la clave no existe, se insertará con un valor construido predeterminado.

Para obtener un iterador de const, use map::find .