blueyi's notes

Follow Excellence,Success will chase you!

0%

实战中遇到的C++问题汇总

项目中遇到过的C++问题

auto与const引用问题

1
2
3
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]);
|| ^

错误行处的代码应更正为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
2
3
4
5
6
7
8
9
10
11
template <typename T> class Base {
public:
int b;
};

template <typename T> class Drive : public class Base<T> {
public:
void asign(int i) { b = i; } //错误,提示定义域内不存在b
void asign(int i) { this->b = i; } //可以
void asign(int i) { Base<T>::b = i; } //可以
};

getline默认会读取\r

使用getline进行文件读取时,一定要考虑空行和行尾有可能出现\r的情况,getline默认情况下会将\r读入。

new创建动态数组

使用new创建动态数组时,如果int *a = new int[25];//定义一个指向含有25个未被初始的元素的动态数组的指针中一旦将中括号[]写成了(),即int *a = new int(25);意思将变成定义一个指向值为25的int型值的指针。

Welcome to my other publishing channels