0

次の C++ クラスとメソッドがあります。const 関数内からプライベート メンバー「発信」にアクセスしようとしていますnumOutgoing()。127 ~ 128 行と 129 ~ 130 行の動作について混乱しています。

129 行目: コピーを作成します。これは後で変更できます。const 関数は関係ありません。

行 127: コピーが作成されていると思っていましたが、コンパイラ エラーが発生します。 行 128: 同じコンパイラ エラーです。

 90 class Graph
 91 {
 92         map<int, vector<int> > outgoing;
 93
 95   public:
 96         Graph(const vector<int> &starts, const vector<int> &ends);
 97         int numOutgoing(const int nodeID) const;
 99 };
100
120
121 int
122 Graph::numOutgoing(const int nodeID) const
123 {
124         if (outgoing.find(nodeID) == outgoing.end()) {
125                 throw invalid_argument("Invalid node Id");
126         }
127         // vector<int> vec = outgoing[nodeID];
128         // const vector<int> &vec = outgoing[nodeID];
129         vector<int> vec = outgoing.at(nodeID);
130         // const vector<int> &vec = outgoing.at(nodeID);
131
132         return vec.size();
133 }

行 127 / 128 で次のコンパイル エラーが発生する理由を理解しようとしています。

./templ.cc:128:42: error: passing 'const std::map<int, std::vector<int> >' as 'this' argument of 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type&) [with _Key = int; _Tp = std::vector<int>; _Compare = std::less<int>; _Alloc = std::allocator<std::pair<const int, std::vector<int> > >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = std::vector<int>; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = int]' discards qualifiers [-fpermissive]

以下は、"map" クラスの operator[] および at メソッドのプロトタイプです。

      mapped_type& operator[] (const key_type& k);  <======
      mapped_type& operator[] (key_type&& k);

      mapped_type& at (const key_type& k);
const mapped_type& at (const key_type& k) const;

誰かがコンパイルエラーを理解するのを手伝ってくれたら本当にありがたい. 問題は型operator[]を返さないことconstでしょうか? もしそうなら、operator[]atは同等ではありませんよね?

4

4 に答える 4

3

その理由は、メソッド

int Graph::numOutgoing(const int nodeID) const

is ですがconstoperator[]const ではありません。これは、設計上の決定によるものです。 に存在しないキーにアクセスしようとすると、キーがoperator[]作成され、 が変更されstd::mapます。

問題を解決するには、 を使用します。map<int, vector<int> >::const_iterator result = outgoing.find(nodeID);ではない場合は、 でキーに、 で値にend()アクセスできます。result->firstresult->second

于 2013-10-24T16:28:39.827 に答える