以下生成错误:
int main() {
mat_int mat1(5, vector<int>{1,2,3});
mat_int mat2(5, vector<int>{4,5,6});
for (auto it1 = mat1.begin(); it1 != mat1.end() ; ++it1) {
for (auto it11 = *it1.begin(); it11 != *it1.end(); it11++)
cout << *it11;
cout << '\n';
}
}
编译器不接受内循环迭代器; /home/asabbah/programming/C++/vectors1.cpp:16:28:错误:'class __gnu_cxx :: __ normal_iterator *,std :: vector&gt; &gt;'没有名为'begin'的成员
但是,如果我插入一个临时变量:
vector<int> temp = *it1;
然后:
for (auto it11 = temp.begin(); it11 != temp.end(); it11++);
一切都很顺利。
知道为什么会这样吗?
答案 0 :(得分:5)
这是因为成员访问运算符.
的{{3}}比取消引用运算符*
多。因此,它会尝试访问begin()
中的it1
方法(它不存在),然后尝试取消引用结果。
而不是
auto it11 = *it1.begin();
DO
auto it11 = it1->begin();
您打算在一个步骤中执行哪些操作。
使用临时变量使编译器首先进行取消引用,然后尝试访问临时变量中的begin
方法。