项目中遇到过的C++问题
auto与const引用问题
1 | error: invalid initialization of non-const reference of type 'std::_Rb_tree_const_iterator<std::pair<const std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >&' from an rvalue of type 'std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >::const_iterator {aka std::_Rb_tree_const_iterator<std::pair<const std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >}' |
错误行处的代码应更正为auto valpair = con.find(valname[cont]);
或者const auto &valpair = con.find(valname[cont]);
错误原因:
map的find成员函数返回的迭代器有可能是const,例如此处传递给函数的map是一个const引用,返回将是一个const的迭代器。而auto此时进行类型推断时,由于使用的是引用,所以auto默认推断的类型为非const的引用。根据修改的内容,显然当不是引用时,auto推断就是const的了;或者手动在auto前面添加一个const。(话说auto应该再智能一点)
模板类继承问题
当一个模板类继承自另一个模板类时,子模板类无法直接访问继承自父模板类的成员,虽然成员已经被继承了,但无法直接在子模板类中访问继承自父模板类的成员,需要使用this指针或者访问限定符来访问继承自父类的成员。
1 | template <typename T> class Base { |
getline默认会读取\r
使用getline进行文件读取时,一定要考虑空行和行尾有可能出现\r
的情况,getline默认情况下会将\r
读入。
new创建动态数组
使用new创建动态数组时,如果int *a = new int[25];//定义一个指向含有25个未被初始的元素的动态数组的指针
中一旦将中括号[]
写成了()
,即int *a = new int(25);
意思将变成定义一个指向值为25的int型值的指针。