近来一直在研究DXR的示例代码,并在其中看到例子中大量的使用了WRL的新模版类代替ATL的老三样的模版类,使用最多的就是COM智能指针Microsoft::WRL::ComPtr类。在聚合使用D3D的接口时,更是像下面这样大量应用该模版包装了D3D的接口:

......
Microsoft::WRL::ComPtr<IDXGIFactory4>               m_dxgiFactory;
Microsoft::WRL::ComPtr<IDXGISwapChain3>             m_swapChain;
Microsoft::WRL::ComPtr<ID3D12Resource>              m_renderTargets[MAX_BACK_BUFFER_COUNT];
Microsoft::WRL::ComPtr<ID3D12Resource>              m_depthStencil;
// Presentation fence objects.
Microsoft::WRL::ComPtr<ID3D12Fence>                 m_fence;
UINT64                                              m_fenceValues[MAX_BACK_BUFFER_COUNT];
Microsoft::WRL::Wrappers::Event                     m_fenceEvent;
// Direct3D rendering objects.
Microsoft::WRL::ComPtr<ID3D12DescriptorHeap>        m_rtvDescriptorHeap;
Microsoft::WRL::ComPtr<ID3D12DescriptorHeap>        m_dsvDescriptorHeap;
......

使用ComPtr包装这些接口的好处就不赘述了,我只是处于对新事物的强烈好奇与推崇,就试图在自己的代码中也引用WRL中的模版类。于是我依葫芦画瓢在我的头文件中加入了简单的一句:

#include <wrl.h>

可是直接编译却报了如下莫名其妙的错误:

c:\program files (x86)\windows kits\10\include\10.0.17134.0\winrt\wrl\event.h(316): error C7510: “Callback”: 模板 从属名称的使用必须以“模板”为前缀

c:\program files (x86)\windows kits\10\include\10.0.17134.0\winrt\wrl\event.h(324): error C7510: “Callback”: 模板 从属名称的使用必须以“模板”为前缀

双击查看代码如下:

template<typename TDelegateInterface, typename TLambda>
ComPtr<typename Details::DelegateArgTraitsHelper<TDelegateInterface>::Interface> Callback(TLambda&& callback) throw()
{using DelegateHelper = Details::DelegateArgTraitsHelper<TDelegateInterface>;return DelegateHelper::Traits::Callback<TDelegateInterface, typename DelegateHelper::Interface>(Details::Forward<TLambda>(callback));
}

从代码分析大概了解这个Callback的模版函数因为又使用了一个lambda函数的参数callback,但是上下文中的模版参数定义只是说这是个类型名,这样在调用Callback的时候编译器就不知道使用Callback的哪个具体模版了,但其实这是个伪错误,根本原因就是在VS2017中,VC++的编译器默认打开了一个开关选项:/permissive-,具体如下图所示:

这个选项的含义根据MSDN的说法是这样:

/permissive-:启用所有严格标准符合性编译器选项,并禁用大部分特定于 Microsoft 的编译器扩展(但有一些例外,比如 __declspec(dllimport))。 在 Visual Studio 2017 15.5 版中此选项默认为开启状态。 /permissive- 符合性模式包括对两阶段名称查找的支持。

当然一如既往的MSDN的这个解释是看不懂的,但大意就是说这个开关打开后好多语言扩展就不能用了,这也是为了适应跨平台跨编译器编译Windows C++代码做的检查。但是这个开关就拦住了WRL里的上述Callback模版函数的调用,最终引起上述的哪个编译错误。

知道了问题的症结,那么修改就不难了,只需要将这个开关关闭即可,如下图:

最终点击确定,编译,一次就通过了!当然后果可能就是对其他的C++编译器来说可能就没法编过了,当然我们使用的本来就是Windows的WRL模版类,推荐使用VC++编译器,不兼容就不兼容吧。

VS2017编译WRL的Callback模版函数兼容性问题及解决方法相关推荐

  1. php自定义函数出现乱码,php的imagettftext 函数出现乱码的解决方法

    php的imagettftext 函数出现乱码的解决方法:今天遇到一个问题,就是往图片上打文字水印,当是汉字的时候出现了乱码,是英文时候并没有出现乱码. 查资料后最终找到两种解决方案,分别如下: 1. ...

  2. 模板引擎不关心内容之——art-template,碰见的同步与fs.readFile异步以及函数回调问题的描述,针对fs的readfille读取文件时,返回不了异步函数返回值的解决方法

    模板引擎不关心内容 art-template art-template不仅可以在浏览器使用,也可以在node中使用 npm install art-template该命令在哪执行就会把包下载在哪里,默 ...

  3. [SDCard_FatFs笔记][一]STM32F7使用SDMMC外设移植FatFs遇到f_mount挂载成功,而f_open函数未运行的解决方法

    关于STM32F7使用SDMMC外设移植FatFs遇到f_mount 挂载成功,而f_open 函数未运行的解决方法 本文开发环境: [ IDE环境:Keil_MDK_5.28 ] [ MCU型号:S ...

  4. arduino红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法

    arduino红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法 参考文章: (1)arduino红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其 ...

  5. jQuery $.post()返回类型为json时不进入回调函数的原因及解决方法

    jQuery $.post()返回类型为json时不进入回调函数的原因及解决方法 参考文章: (1)jQuery $.post()返回类型为json时不进入回调函数的原因及解决方法 (2)https: ...

  6. jquery的ajax()函数传值中文乱码解决方法介绍

    jquery的ajax()函数传值中文乱码解决方法介绍 参考文章: (1)jquery的ajax()函数传值中文乱码解决方法介绍 (2)https://www.cnblogs.com/xuxiaosh ...

  7. zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法

    转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法:  z ...

  8. Linux下C/C++程序编译链接加载过程中的常见问题及解决方法

    Linux下C/C++程序编译链接加载过程中的常见问题及解决方法 1 头文件包含的问题 报错信息 该错误通常发生在编译时,常见报错信息如下: run.cpp:2:10: fatal error: dl ...

  9. php的email函数发送失败,php中mail函数发送邮件失败的解决方法_php技巧

    本文实例讲述了php中mail函数发送邮件失败的解决方法.分享给大家供大家参考.具体分析如下: php中mail函数是一个自带的发邮件的函数,但是如果你真的要使用mail函数来发邮件那必须是要给你系统 ...

最新文章

  1. 1.A+B Problem
  2. BAPI:KBPP_EXTERN_UPDATE_CO, TCODE:CJ30/CJ40
  3. excel同一单元格怎么换行_Excel工作表中最经典的10个应用,小技巧,大作用
  4. 存储器芯片巨头动态观察:三星、美光、SK海力士都在做什么?
  5. gradle创建web工程_Gradle入门:创建Web应用程序项目
  6. 一个简单的空气质量数据监测站项目
  7. 中科院信工所经验_2021中科院信息工程研究所电子信息专业考研经验指导分享...
  8. Android onKeyDown、onKeyUp、dispatchKeyEvent的区别
  9. MaxKey单点登录认证系统 v2.4.0 RC
  10. 经典调用共享变量wait()方法的实例
  11. How to Run Mac OS X in VirtualBox on Windows
  12. 在linux里安装python3.6环境,Python基础—环境准备之Python3.6 在Linux/Windows上安装
  13. nicescroll.js滚动条错位
  14. Chrome 安装Axure 插件
  15. 颠覆Web前端开发的HTML5技术
  16. 扫外部二维码进入小程序,并且在小程序内获取二维码链接
  17. 【水题】CodeForce 1183B Equalize Prices
  18. Java笔记:面向对象3大特性
  19. 软件项目管理复习(一-七章)
  20. 计算机内存不足360杀毒,电脑内存经常不足到底怎么办

热门文章

  1. 金融科技:人行二代征信和百行征信接入方案
  2. 学好编程必需先学好的基础
  3. 央企招聘:正式编制!八险三金!各项福利!中国邮政招人啦!
  4. 做人呢,一定要谨记下面两个原则
  5. php中平方代码_php 做出平方代码,用类来实现的接口,初学者请大侠们出手啊。...
  6. oracle idc排名,idc 排行_2015中国IDC排行榜TOP20
  7. 【数据可视化应用】xarray 绘图可视化(五)-二进制GrADS气象数据处理(附代码)
  8. 转:工程师比科学家低一等吗? (末尾有本人的微小评论)
  9. iOS 集成微信支付
  10. 企企通聚源池| 聚合海量资源全网寻源,赋能供采双方撮合交易