最近用 WTL 写 Ribbon 界面,发现一个坑。
先看 WTL9.1 的代码
1 | static void (CharFormat::*Getk_[])(IPropertyStore*) = |
其中 Getk_MaskEffect 是个模版函数,实现如下:
1 | template <DWORD t_dwMask, DWORD t_dwEffects, REFPROPERTYKEY key> |
然后,在 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,https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39018,翻译一下:模版函数的地址转化,分两步走,第一步先转具化,第二步转目标类型,这样可以;直接转过去不可以!
再来看看 WTL10 怎么解决这个问题的!
1 | static void (CharFormat::*Getk_[])(IPropertyStore*) = |
原来的模版函数,已经替换成普通函数了……
1 | void Getk_MaskEffectBold(IPropertyStore* pStore) |