• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 初学WTL,第一章里面的递归模板的例子咋就编译不过?

初学WTL,第一章里面的递归模板的例子咋就编译不过?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了wtl,wtl是什么意思,wtl 代理商哪家好,wtl 7019 gly2,wtl design等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 初学WTL,第一章里面的递归模板的例子咋就编译不过?
描述:

《MFC程序员的WTL教程》里面第一章给了这个例子:
#include <iostream>
using namespace std;
template <class T>
class B1
{
public:
void SayHi()
{
T* pT = static_cast<T*>(this);   // HUH?? 我将在下面解释
pT->PrintClassName();
}
protected:
void PrintClassName() { cout << "This is B1" << endl; }
};
class D1 : public B1<D1>
{
// No overridden functions at all
};
class D2 : public B1<D2>
{
protected:
void PrintClassName() { cout << "This is D2" << endl; }
};
int main(int, char *[])
{
D1 d1;
D2 d2;
d1.SayHi();    // prints "This is B1"
d2.SayHi();    // prints "This is D2"
//d1.PrintClassName();
//d2.PrintClassName();
getchar();
return 0;
}
我编译就有错。
1>e:\test\hert\hert\main.cpp(12) : error C2248: “D2::PrintClassName”: 无法访问 protected 成员(在“D2”类中声明)
1>        e:\test\hert\hert\main.cpp(26) : 参见“D2::PrintClassName”的声明
1>        e:\test\hert\hert\main.cpp(23) : 参见“D2”的声明
1>        e:\test\hert\hert\main.cpp(9): 编译类 模板 成员函数“void B1<T>::SayHi(void)”时
我把PrintClassName改为public之后就好了
这是怎么回事?
按理说,protected应该也可以呀
但为啥这样会有错误?
还有一个问题呀,我不知道用这种递归模板有什么优势?
直接用d1.PrintClassName()和d2.PrintClassName()不是也可以吗?
也能达到相同的效果呀,不太明白
谢谢!!!


解决方案1:

基础问题:父类调用子类没法按照继承关系来处理,在编译器看来,它们就是两个相互独立的类/对象,所以是不可以访问“其它”类的保护成员的。
反过来,子类调用父类的,则适用继承关系。
你这里的干扰点是:以为模板可以把这种继承关系传递给父类。其实不然,模板只是节约了我们的代码量,可不负责把继承关系到处传递。

解决方案2:

编译期多态

解决方案3:

通过递归模板可实现多态.

解决方案4:

按你这代码,当然得public了


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 看了一下WTL,对这个代码看不懂
  • 要用atl写个控件,涉及到界面的,怎么将wtl和atl结合起来用呐?用wtl来做控件的界面
  • 在ATL中使用WTL中的CFileDialog实现预览功能出现的不刷新问题,高手进
  • 使用WTL库,编译提示“cannotopenincludefile"atlresh"”,这是怎么回事?
  • WTL能否用于ATL做COM组件的界面?需要注意什么?
  • WTL中,怎么改变lineto画线的颜色和粗细?
  • WTL问题,MainFrame加一个Destory响应怎么会这样
  • 请大家帮忙看看这个:关于wtl
  • WTL,CCodePageCombo继承CComboBoxT<ATL::CWindow>类,需要响应下拉菜单CloseUp的消息
  • WTL下如何添加Mediaplayer控件

相关文章

  • 2017-06-04 关于连接点和事件……应该需要高手。
  • 2017-06-05 控制其他进程的scrollbar控件的问题
  • 2017-06-04 Activex调用了其他的dll不能反注册
  • 2017-06-05 C#和com组件的数据交互
  • 2017-06-04 初学,大惑不解,大侠不要嫌简单,帮个忙
  • 2017-06-04 请问写的idl文件,到那个地方要MIDL对它进行编译,在TC中有吗?如果在vc中怎么对它进行单独的编译?
  • 2017-06-04 菜菜的问题:word是com对象吗?如果是…………详情请进!
  • 2017-06-04 将WORD文档以二进制形式读入内存,如何直接显示出来?不保存成文件。
  • 2017-06-05 在win98下如何获得所有进程的列表???
  • 2017-06-04 ATL初学者,各位能否推荐几本入门电子书籍

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 2000服务service的的派生进程与桌面交互问题。
    • AfxBeginThread的使用问题!
    • 我编写了一个Win32DLL程序,但当我使用下面的方法去使用该dll文件的时候,编译时出现LNK2001错误。。。。
    • 基于Com/ActiveX图形控件在Vc中使用免费使用http://onefsphostcom/sofish下载,欢迎交流
    • -------------求指点MFCActiveX控件--------
    • 4路鱼眼镜头拍摄的视频的拼接融合
    • 关于COM连接点的疑问
    • wmp控件全屏模式下键盘无响应
    • 初级错误,请大侠指教。
    • vc+ao“IGxDialogPtr”:未声明的标识符

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有