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.d0
LoggingMsgSenderzMsgSender;ITPUB个人空间 xVV}m)Q#O*D
MsgInfo msgData;
CKuV5y0... // 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/P Tt2_lg0

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-08-30  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 29240
  • 日志数: 3708
  • 建立时间: 2008-04-12
  • 更新时间: 2008-08-15

RSS订阅

Open Toolbar