博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求模版函数地址
阅读量:7087 次
发布时间:2019-06-28

本文共 2995 字,大约阅读时间需要 9 分钟。

最近用 WTL 写 Ribbon 界面,发现一个坑。

先看 WTL9.1 的代码

static void (CharFormat::*Getk_[])(IPropertyStore*) = {    &CharFormat::Getk_Family,     &CharFormat::Getk_FontProperties_Size,     &CharFormat::Getk_MaskEffect
, &CharFormat::Getk_MaskEffect
, &CharFormat::Getk_MaskEffect
, &CharFormat::Getk_MaskEffect
, &CharFormat::Getk_VerticalPositioning, &CharFormat::Getk_Color
, &CharFormat::Getk_Color
, &CharFormat::Getk_ColorType
, &CharFormat::Getk_ColorType
,};

其中 Getk_MaskEffect 是个模版函数,实现如下:

template 
void Getk_MaskEffect(IPropertyStore* pStore){ if (SUCCEEDED(pStore->GetValue(key, &propvar))) { UIPropertyToUInt32(key, propvar, &uValue); if ((UI_FONTPROPERTIES)uValue != UI_FONTPROPERTIES_NOTAVAILABLE) { dwMask |= t_dwMask; dwEffects |= ((UI_FONTPROPERTIES) uValue == UI_FONTPROPERTIES_SET) ? t_dwEffects : 0; } } }

然后,在 VS2017 编译失败了……

1>X:\WTL91_5321_Final\Include\atlribbon.h(422): error C2440: 'initializing': cannot convert from 'overloaded-function' to 'void (__thiscall WTL::RibbonUI::CharFormat::* )(IPropertyStore *)'

1>X:\WTL91_5321_Final\Include\atlribbon.h(422): note: None of the functions with this name in scope match the target type

然后根据错误提示搜到:Cannot take address of template function,,翻译一下:模版函数的地址转化,分两步走,第一步先转具化,第二步转目标类型,这样可以;直接转过去不可以!

再来看看 WTL10 怎么解决这个问题的!

static void (CharFormat::*Getk_[])(IPropertyStore*) = {    &CharFormat::Getk_Family,     &CharFormat::Getk_FontProperties_Size,     &CharFormat::Getk_MaskEffectBold,    &CharFormat::Getk_MaskEffectItalic,    &CharFormat::Getk_MaskEffectUnderline,    &CharFormat::Getk_MaskEffectStrikeout,    &CharFormat::Getk_VerticalPositioning,    &CharFormat::Getk_Color,     &CharFormat::Getk_ColorBack,     &CharFormat::Getk_ColorType,    &CharFormat::Getk_ColorTypeBack,};

原来的模版函数,已经替换成普通函数了……

void Getk_MaskEffectBold(IPropertyStore* pStore){    Getk_MaskEffectAll(pStore, CFM_BOLD, CFE_BOLD, UI_PKEY_FontProperties_Bold);}void Getk_MaskEffectItalic(IPropertyStore* pStore){    Getk_MaskEffectAll(pStore, CFM_ITALIC, CFE_ITALIC, UI_PKEY_FontProperties_Italic);}void Getk_MaskEffectUnderline(IPropertyStore* pStore){    Getk_MaskEffectAll(pStore, CFM_UNDERLINE, CFE_UNDERLINE, UI_PKEY_FontProperties_Underline);}void Getk_MaskEffectStrikeout(IPropertyStore* pStore){    Getk_MaskEffectAll(pStore, CFM_STRIKEOUT, CFE_STRIKEOUT, UI_PKEY_FontProperties_Strikethrough);}void Getk_MaskEffectAll(IPropertyStore* pStore, DWORD _dwMask, DWORD _dwEffects, REFPROPERTYKEY key){    if (SUCCEEDED(pStore->GetValue(key, &propvar)))    {        UIPropertyToUInt32(key, propvar, &uValue);        if ((UI_FONTPROPERTIES)uValue != UI_FONTPROPERTIES_NOTAVAILABLE)        {            dwMask |= _dwMask;            dwEffects |= ((UI_FONTPROPERTIES)uValue == UI_FONTPROPERTIES_SET) ? _dwEffects : 0;        }    }}

转载于:https://my.oschina.net/umu618/blog/1648712

你可能感兴趣的文章
探究ConcurrentHashMap中键值对在Segment[]的下标如何确定
查看>>
数据结构与框架-抽象类与接口
查看>>
hdu 1163 Eddy's digital Roots
查看>>
chrome最小字体12px如何修改
查看>>
elementui input样式覆盖 头部小图等
查看>>
poj 1088滑雪【深搜】
查看>>
什么是关键字驱动框架(自动化测试)
查看>>
黑马程序员-面向对象-07天-8 (模版方法)
查看>>
python监控服务器的主备模式
查看>>
代码片段
查看>>
win8 iis 安装
查看>>
Openstack Neutron 允许VM流量转发
查看>>
Windows 7/8/8.1 硬盘安装法实现 ubuntu 14.04 双系统
查看>>
nodejs单元测试
查看>>
Docker学习记录3: 搭建 Private Registry
查看>>
HDU Common Subsequence(最长公共子序列)
查看>>
quartz 持久化 数据库表
查看>>
System 类的使用
查看>>
最小生成树之prim算法
查看>>
hdu-1598 find the most comfortable road---kruskal+枚举下界
查看>>