《MFC程序员的WTL教程》第一个例程的一个错误

作者:朱金灿

来源:http://blog.csdn.net/clever101

 

         《MFC程序员的WTL教程》第一个例程在于说明ATL的原理,其代码如下:

#include <iostream>

template<class T>
class B1
{
public:
   void SayHi()
   {
	    T* pT = static_cast<T*>(this);
		pT->PrintClassName();
   }

protected:
   void PrintClassName()
   {
	   std::wcout<<_T("This is B1")<<std::endl;
   }

private:
};

class D1:public B1<D1>
{
// No overridden functions at all
public:
protected:
private:
};

class D2 : public B1<D2>
{
public:
protected:
   void PrintClassName()
   {
	   std::wcout<<_T("This is D2")<<std::endl;
   }

private:
};

int _tmain(int argc, _TCHAR* argv[])
{
	D1 d1;
	d1.SayHi();
	D2 d2;
	d2.SayHi();
	getchar();
	return 0;
}

           实际上这段代码是有问题。在VS 2005(带sp1)环境编译下出现以下编译错误:

d:\wtllearn\lesson1\lesson1\lesson1.cpp(14) : error C2248: 'D2::PrintClassName' :cannot access protected member declared in class 'D2'

1>        d:\wtllearn\lesson1\lesson1\lesson1.cpp(38) : see declaration of 'D2::PrintClassName'

1>        d:\wtllearn\lesson1\lesson1\lesson1.cpp(34) : see declaration of 'D2'

1>        d:\wtllearn\lesson1\lesson1\lesson1.cpp(12) : while compiling class template memberfunction 'void B1<T>::SayHi(void)'

1>        with

1>        [

1>            T=D2

1>        ]

1>        d:\wtllearn\lesson1\lesson1\lesson1.cpp(35) : see reference to class templateinstantiation 'B1<T>' being compiled

1>        with

1>        [

1>            T=D2

1>                                    ]

 

         问题在于基类B1无法访问派生类D2的保护权限的成员函数。解决办法是将D2:: PrintClassName函数改为public权限。我想ATL中所有需要重载的函数应该都是public的。


WTL 在开发者之间的悄悄传播已经超过一年了, 传闻它是基于ATL的,并在微软内部使用.这理所当然的引起了ATL开发者社区的注意.这些人从ATL1.1开始,就一直为ATL控件书写UI代码,但是他们发现,他们的所写的代码常常就是纯的Win32 GDI代码.我告诉您, WTL并没有多大不同.是不是让人失望? 不,因为ATL只是对COM进行了简单的封装,这也是ATL的强大之处. 是的,写ATL您必须通晓COM. 您在ATL上额外花费的功夫跟您学习COM所作的努力比起来,简直微不足道.这跟那些需要把主要精力花费在学习类库本身,忽略COM的库是完全不同的.WTL与此类似.您需要懂得Win32窗口技术和GDI.只要您懂得,学习WTL就似清风抚面,再简单不过了.如果您不懂 这些,那么您最好使用VB来写UI代码. 它给各种类型的应用程序提供了一个基本的框架.注意,虽然您没有MFC那样的文档/视结构,但是您有视(views). 在WTL有大量的代码让您来管理视,而且加入您自己的代码也很容易. WTL有AppWizard,可以让您生成SDI, MDI 和多线程SDI程序多线程SDI跟IE或Windows Explorer很像.它看起来是打开了多个程序实例,实际上这些窗口都是属于一个进程的.另外,您的程序可以是基于对话框的,也可以是基于视的.视可以是基于CWindowImpl的,也可以是基于控件,甚至是IE里的一个HTML页.您可以选择您的程序是否需要一个rebar, command bar (CE-like), toolbar 和/或status bar.另外,您的程序可以主持ActiveX控件,以及成为一个COM服务器. 这里有几个关于视的选项. WTL提供splitter窗口类(这样在一个视里您可以有两个窗口)和scroll窗口类(这样您的窗口可以比它显示的"视"小). WTL也有个类似MFC的UpDateUI的东西,但是它们不是很一样 - 主要的区别是您需要把需要更新的项用宏映射标注出来,然后您在您的类里加入执行UpdateUI的代码. DDX/DDV在WTL也支持,同样类似MFC,但有不同. 您必须加一个宏映射来实现DoDataExchange,然后加入调用它的代码.现在WTL也有GDI类了.然而,HDC的封装类就像CWindow一样,只进行了很简单的封装 - 它几乎没有加入任何新的功能.不过,在WTL,你可以得到播放meta文件和OpenGL支持. 最有价值的我猜应该是打印机DC的那些继承类 - WTL有打印机支持,甚至打印预览. 当然也有GDI对象的封装. 诸如画笔,画刷,区域等.WTL对所有的Win32 (和W2K) 通用对话框进行了封装.同样尽管简单,但是它的确使请求字体或者文件变的非常的简单.合成了旧的AtlControls.h,新加了一些封装类. 这些封装类封装了W2K控件,以及一些不属于Win32的"控件",像Command Bar, bitmap button, hyperlink 和 wait cursor.WTL 最终把消息分离带入了ATL! 一些新的MSG映射宏将消息分离,调用您类里的消息处理函数.消息处理函数的参数的值是从消息分离得到的.唯一令人头痛的是,您需要查看头文件以确定函数参数的意义.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clever101

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值