VS2017编译WRL的Callback模版函数兼容性问题及解决方法
近来一直在研究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模版函数兼容性问题及解决方法相关推荐
- php自定义函数出现乱码,php的imagettftext 函数出现乱码的解决方法
php的imagettftext 函数出现乱码的解决方法:今天遇到一个问题,就是往图片上打文字水印,当是汉字的时候出现了乱码,是英文时候并没有出现乱码. 查资料后最终找到两种解决方案,分别如下: 1. ...
- 模板引擎不关心内容之——art-template,碰见的同步与fs.readFile异步以及函数回调问题的描述,针对fs的readfille读取文件时,返回不了异步函数返回值的解决方法
模板引擎不关心内容 art-template art-template不仅可以在浏览器使用,也可以在node中使用 npm install art-template该命令在哪执行就会把包下载在哪里,默 ...
- [SDCard_FatFs笔记][一]STM32F7使用SDMMC外设移植FatFs遇到f_mount挂载成功,而f_open函数未运行的解决方法
关于STM32F7使用SDMMC外设移植FatFs遇到f_mount 挂载成功,而f_open 函数未运行的解决方法 本文开发环境: [ IDE环境:Keil_MDK_5.28 ] [ MCU型号:S ...
- arduino红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法
arduino红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法 参考文章: (1)arduino红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其 ...
- jQuery $.post()返回类型为json时不进入回调函数的原因及解决方法
jQuery $.post()返回类型为json时不进入回调函数的原因及解决方法 参考文章: (1)jQuery $.post()返回类型为json时不进入回调函数的原因及解决方法 (2)https: ...
- jquery的ajax()函数传值中文乱码解决方法介绍
jquery的ajax()函数传值中文乱码解决方法介绍 参考文章: (1)jquery的ajax()函数传值中文乱码解决方法介绍 (2)https://www.cnblogs.com/xuxiaosh ...
- zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法
转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: z ...
- Linux下C/C++程序编译链接加载过程中的常见问题及解决方法
Linux下C/C++程序编译链接加载过程中的常见问题及解决方法 1 头文件包含的问题 报错信息 该错误通常发生在编译时,常见报错信息如下: run.cpp:2:10: fatal error: dl ...
- php的email函数发送失败,php中mail函数发送邮件失败的解决方法_php技巧
本文实例讲述了php中mail函数发送邮件失败的解决方法.分享给大家供大家参考.具体分析如下: php中mail函数是一个自带的发邮件的函数,但是如果你真的要使用mail函数来发邮件那必须是要给你系统 ...
最新文章
- 1.A+B Problem
- BAPI:KBPP_EXTERN_UPDATE_CO, TCODE:CJ30/CJ40
- excel同一单元格怎么换行_Excel工作表中最经典的10个应用,小技巧,大作用
- 存储器芯片巨头动态观察:三星、美光、SK海力士都在做什么?
- gradle创建web工程_Gradle入门:创建Web应用程序项目
- 一个简单的空气质量数据监测站项目
- 中科院信工所经验_2021中科院信息工程研究所电子信息专业考研经验指导分享...
- Android onKeyDown、onKeyUp、dispatchKeyEvent的区别
- MaxKey单点登录认证系统 v2.4.0 RC
- 经典调用共享变量wait()方法的实例
- How to Run Mac OS X in VirtualBox on Windows
- 在linux里安装python3.6环境,Python基础—环境准备之Python3.6 在Linux/Windows上安装
- nicescroll.js滚动条错位
- Chrome 安装Axure 插件
- 颠覆Web前端开发的HTML5技术
- 扫外部二维码进入小程序,并且在小程序内获取二维码链接
- 【水题】CodeForce 1183B Equalize Prices
- Java笔记:面向对象3大特性
- 软件项目管理复习(一-七章)
- 计算机内存不足360杀毒,电脑内存经常不足到底怎么办
热门文章
- 金融科技:人行二代征信和百行征信接入方案
- 学好编程必需先学好的基础
- 央企招聘:正式编制!八险三金!各项福利!中国邮政招人啦!
- 做人呢,一定要谨记下面两个原则
- php中平方代码_php 做出平方代码,用类来实现的接口,初学者请大侠们出手啊。...
- oracle idc排名,idc 排行_2015中国IDC排行榜TOP20
- 【数据可视化应用】xarray 绘图可视化(五)-二进制GrADS气象数据处理(附代码)
- 转:工程师比科学家低一等吗? (末尾有本人的微小评论)
- iOS 集成微信支付
- 企企通聚源池| 聚合海量资源全网寻源,赋能供采双方撮合交易