2013-05-08 13 views
15

Ich weiß nicht, woher der Fehler kommt. Es scheint, als würde ich gültige Daten in den Operator [] übergeben.binär '[': kein Operator gefunden, der einen linken Operanden vom Typ 'const std :: map <_Kty,_Ty>'

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 

Der Fehler:

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>   ] 

Und die Graph Klasse:

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 

Antwort

33

operator[] kann nur auf nicht const Karte aufgerufen werden.

Wenn der Schlüssel nicht existiert, wird er mit einem konstruierten Standardwert eingefügt.

Um einen konstanten Iterator zu erhalten, verwenden Sie map::find.

+3

Eine andere Alternative wäre 'std :: map :: at' – PlasmaHH

+1

@PlasmaHH Ja, [' std :: map :: at'] (http://en.cppreference.com/w/cpp/container/map/at) hat eine andere Semantik, indem es eine Ausnahme auslöst, wenn das Element nicht existiert. –

+0

Klingt wie eine eklatante Unterlassung zu mir –