2013-05-08 9 views
15

エラーの原因がわかりません。私は有効なデータを[]演算子に渡しているようです。バイナリ '[': '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 

エラー:

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

そして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 

答えて

33

operator[]は非constマップで呼び出すことができます。

キーが存在しない場合は、デフォルトの構成値で挿入されます。

constイテレータを取得するには、map::findを使用します。

+3

もう一つの代替手段は、 'std :: map :: at' – PlasmaHH

+1

@PlasmaHHはい、[' std :: map :: at'](http://en.cppreference.com/w/cpp/container/map/at)は、要素が存在しない場合に例外をスローするという点で、異なるセマンティクスを持ちます。 –

+0

ぼんやりしたような不気味さが聞こえます –

関連する問題