2013-05-08 19 views
15

Tôi không biết lỗi đến từ đâu. Có vẻ như tôi đang chuyển dữ liệu hợp lệ vào toán tử [].nhị phân '[': không tìm thấy toán tử nào có toán hạng bên trái của loại '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 

Lỗi:

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

Và lớp 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 

Trả lời

33

operator[] chỉ có thể được gọi là trên bản đồ phi const.

Nếu khóa không tồn tại, nó sẽ được chèn với giá trị được tạo mặc định.

Để có trình biến đổi const, hãy sử dụng map::find.

+3

Một giải pháp thay thế khác sẽ là 'std :: map :: at' – PlasmaHH

+1

@PlasmaHH Có, [' std :: map :: at'] (http://en.cppreference.com/w/cpp/container/map/at) có ngữ nghĩa khác nhau ở chỗ nó ném một ngoại lệ nếu phần tử không tồn tại. –

+0

Âm thanh như một thiếu sót rõ ràng đối với tôi –