关于模板化基类的变量
2023-01-10 11:19 作者:sxlxcsxlxc | 我要投稿
这大概是c++ template 的基础吧,但是还是挺有意思的?
前段时间写 kinetic priority queue 想试试用模板(实际上并没有这种必要),发现派生类不能访问到模板化的基类里面的成员,必须要用this才能访问,感觉很奇怪。昨天在effective c++上面看到43条 know how to access names in templatized base classes 才知道是怎么回事。
我本来以为是这样:由于基类是个模板类,继承的时候并不知道基类当中到底有没有我想要访问的变量,所以必须用this或者明确表示我要访问基类的那个变量,于是编译器就假设这个名字确实存在并且确实是个变量。然而仔细一想为什么编译器会不了解我想要访问的名字的信息呢?基类的定义编译器已经知道了,在实例化模板的时候基类自然也会有一份对应类型的代码生成,编译器应该可以获取到模板基类当中的所有信息,并不会产生什么问题。
看了书才知道,问题出在模板全特化
但是这又有什么问题呢,如果是在模板参数实例化的时候编译器一样可以知道基类的信息。好像只要在模板实例化的时候再来诊断问题就没有这些麻烦了。只能说,较早发现问题应该是比较好的。
另外,一个不能在 base class list 或者 member initialization list 当中使用typename的例子