我有以下 C++ 类和方法。我正在尝试从 const 函数中访问私有成员“传出” numOutgoing()
。我对第 127-128 行和第 129-130 行的行为感到困惑。
第 129 行:制作一个副本,以后可以修改,const 函数不关心 第 130 行:获取引用,但是 vec 被定义为 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
是不等价的,对吧?