2013-05-08 16 views
15

Nie wiem, skąd pochodzi błąd. Wygląda na to, że przekazuję prawidłowe dane do operatora [].binarny "[": nie znaleziono operatora, który bierze lewy operand typu "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 

Błąd:

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

I klasa 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 

Odpowiedz

33

operator[] można nazwać tylko na nie- const mapie.

Jeśli klucz nie istnieje, zostanie wstawiony z domyślną wartością konstrukcyjną. Aby uzyskać iterator stałej, użyj .

+3

Inną opcją jest 'std :: map :: at' – PlasmaHH

+1

@PlasmaHH Tak, [' std :: map :: at'] (http://en.cppreference.com/w/cpp/container/map/at) ma inną semantykę, ponieważ generuje wyjątek, jeśli element nie istnieje. –

+0

Brzmi jak rażące zaniedbanie dla mnie –