1.子类继承父类后无法访问父类中的protected public成员,访问时显示未定义
分析:子类继承父类,访问权限如下表
父类
继承关系 | public | protected | private |
---|---|---|---|
public | public | protected | private |
protected | protected | protected | private |
private | private | private | private |
从访问权限是不应该的,经一步步调试发现是因为添加了模板编程带来的问题。
C++模板二段名字查找方法
根据 C++ 标准,对模板代码中的名字的查找,分为两个阶段进行:
模板定义阶段:刚被定义时,只有模板中独立的名字(可以理解为和模板参数无关的名字)参加查找
模板实例化阶段:实例化模板代码时,非独立的名字才参加查找。
如果没有用模板,事情会简单很多。然而这里的 B 本身是模板,需要进行二段式名字查找。
首先进入 B 的模板定义阶段,此时 B 的基类 A 依赖于模板参数 T,所以是一个「非独立」的名字。所以在这个阶段,对于 B 来说 A 这个名字是不存在的,于是 A::f() 也不存在。但此时这段代码仍旧是合法的,因为此时编译器可以认为 f 是一个非成员函数。
1.对于两个非模板继承是可直接继承.
2.对于模板类继承非模板类时,在模板声明进行解析的时候就会进行查找
3.对于继承父类是模板类的会进行名称二次查找
解决方案:添加this指针指向所需要的父类访问成员
一个模板子类其实是不能在实例化之前就知道他的模板父类到底是谁,所以只能this->了
2. C2440 “return”: 无法从“list::iterator”转换为“list::iterator”(:由于复制构造函数不明确或者没有可用的复制构造函数,因此无法复制构造)
实际问题经编译器报错得知:是由于复制构造函数不明确或者没有可用的复制构造函数,因此无法复制构造
程序情况说明:编写list的迭代器,普通迭代器iterator和const_iterator,iterator继承const_iterator
解决:在拷贝构造函数加一个const
const_iterator(const const_iterator &_X) :_Ptr(_X._Ptr)
{}
3. out_of_range找不到标识符
在编写_Xran的函数时,out_of_range隶属于std库中,因此需要添加 std:: 作用域
void _Xran() const
{
_THROW(std::out_of_range, "invalid vector<bool> subscript");
}