C++箴言:如何访问模板化基类中的名字 (5)
上一篇 /
下一篇 2008-05-04 13:52:41
通常这是一个解决这个问题的最不合人心的方法,因为如果被调用函数是 virtual(虚拟)的,显式限定会关闭 virtual binding(虚拟绑定)行为。
9EcO5p|0ITPUB个人空间8U;iXx3n'ZkD 从名字可见性的观点来看,这里每一个方法都做了同样的事情:它向编译器保证任何后继的 base class template(基类模板)的 specializations(特化)都将支持 general template(通用模板)提供的
interface(接口)。所有的编译器在解析一个像 LoggingMsgSender 这样的 derived class template(派生类模板)是,这样一种保证都是必要的,但是如果保证被证实不成立,真相将在后继的编译过程中暴露。例如,如果后面的源代码中包含这些,
ITPUB个人空间{mD4`Ac*QHaD)`'J^d([
K9@G-E.d0LoggingMsgSenderzMsgSender;ITPUB个人空间
xVV}m)Q#O*D MsgInfo msgData; C Ku V5y0... // put info in msgDataITPUB个人空间 g8s`i#Ly\xr zMsgSender.sendClearMsg(msgData); // error! won't compile |
NlQ)G:Cgb0 对 sendClearMsg 的调用将不能编译,因为在此刻,编译器知道 base class(基类)是 template specialization(模板特化)MsgSender,它们也知道那个 class(类)没有提供 sendClearMsg 试图调用的 sendClear function(函数)。
H,RvZ%M~s"_1tBa0
oK)CCl {c YV0 从根本上说,问题就是编译器是早些(当 derived class template definitions(派生类模板定义)被解析的时候)诊断对 base class members(基类成员)的非法引用,还是晚些时候(当那些 templates(模板)被特定的 template arguments(模板参数)实例化的时候)再进行。C++ 的方针是宁愿早诊断,而这就是为什么当那些 classes(类)被从 templates(模板)实例化的时候,它假装不知道 base classes(基类)的内容。
{%}|!D0iIW0ITPUB个人空间%pj&Ul
_
i%^)L8W$X
Things to RememberITPUB个人空间W*Y8B_+q\?f
ITPUB个人空间lE:s`&}]4C0_
·在 derived class templates(派生类模板)中,可以经由 "this->" 前缀引用 base class templates(基类模板)中的名字,经由 using declarations,或经由一个 explicit base class qualification(显式基类限定)。
4z/PTt2_lg0
导入论坛
引用链接
收藏
分享给好友
推荐到圈子
管理
举报
TAG: