更新 Visual Studio 2017,现在出现编译错误 C7510:“回调”:使用依赖模板名称必须以“模板”为前缀

Posted

技术标签:

【中文标题】更新 Visual Studio 2017,现在出现编译错误 C7510:“回调”:使用依赖模板名称必须以“模板”为前缀【英文标题】:Update visual studio 2017, now getting compile error C7510: 'Callback': use of dependent template name must be prefixed with 'template' 【发布时间】:2018-08-15 18:36:23 【问题描述】:

我尝试在更新 (15.8.0) 后照常编译我的项目。我将 showincludes 设置为 yes 以找出错误的来源,但它都是系统代码。从 stdafx.cpp 开始,它会遍历所有包含和错误:

 1>Note: including file:     C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\shared\pshpack8.h
 1>Note: including file:     C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\shared\poppack.h
 1>Note: including file:    C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\shared\pshpack8.h
 1>Note: including file:    C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\shared\poppack.h
 1>Note: including file:   C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\winrt\wrl\event.h
 1>Note: including file:    C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\winrt\eventtoken.h
 1>Note: including file:    C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\shared\pshpack8.h
 1>c:\program files (x86)\windows kits\10\include\10.0.17134.0\winrt\wrl\event.h(316): error C7510: 'Callback': use of dependent template name must be prefixed with 'template'
 1>c:\program files (x86)\windows kits\10\include\10.0.17134.0\winrt\wrl\event.h(324): error C7510: 'Callback': use of dependent template name must be prefixed with 'template'

有人见过这个吗?我在谷歌上下搜索以找到无济于事的答案。缺少修改windows sdk,不知道怎么办。

编辑: 在我安装的 Windows SDK 中,错误出现在文件中-

C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\winrt\wrl\event.h

更改第 316 行:return DelegateHelper::Traits::Callback(Details::Forward(callback));

to: return DelegateHelper::Traits::template Callback(Details::Forward(callback));

和第 324 行:返回 DelegateHelper::Traits::Callback(

返回DelegateHelper::Traits::template Callback(Details::Forward(callback));

由于修改sdk并不是真正的解决方案,所以彭杜在配置窗口中选择不符合的解决方案是可行的。

【问题讨论】:

“从 stdafx 开始” - 也许已经摆脱了那个,以获得更少的惊喜。 继续往下看。边走边检查。 看来错误来自更新后的子项目 DirectXTK12。这可能是工具包源代码中的错误,而不是 sdk 中的错误。 @JesperJuhl:这不会有什么帮助。这不是大魔法。此外,问题出在 SDK 标头中,如果需要,就需要它。如何获取包含的标头(通过 stdafx.h 或直接)并不重要。 此issue 已被 DirectXTK 库的作者确认。 【参考方案1】:

我有遗留项目,我并排比较了项目设置,最后我通过设置成功构建了新项目:Configuration Properties > C/C++ > Language > Conformance mode = No

【讨论】:

我个人更喜欢@IInspectable 的建议,它实际上只是 /Zc:twoPhase- 编译器选项,您想使用它来让编译器与 WRL 源一致。【参考方案2】:

当你使用依赖模板名时,你have to use a template keyword,例如:

foo.template bar<T>();

直到某个时候,MSVC 对使用 typenametemplate 消歧器并不严格,但在更新后规则发生了变化。

【讨论】:

这就是解决方案。只需要找到错误的来源......大声笑。 显示行号。检查那里有什么。可能您应该更新这些标头或使用编译器开关来临时恢复旧的解析模式。【参考方案3】:

问题出在 Windows 运行时库中,而对 Visual Studio 的一些更改破坏了它。我在这台更新到 15.8.2 的笔记本电脑上遇到了同样的问题,我在家里运行早期版本的机器没有这样做,因为完全相同的代码在我的另一台机器上编译,它一定是 VS 中的错误,或者WRL/事件类需要更改。

编辑:修复上述返回值,错误在 SDK 中,你不应该禁用 /permissive- 因为这可以防止 Spectre 和其他安全增强。

【讨论】:

SDK 和编译器都没有错误。编译器的变化是,15.8.0 引入了两阶段名称查找。您可以使用/Zc:twoPhase- 编译器选项禁用两阶段名称查找。 /permissive- 自动选择两阶段名称查找。您可以结合这两个标志来让编译器同意 WRL 源代码。 /permissive-没有与防范 Spectre 有任何关系。 很好的附加信息。此外,请查看此博客以了解为减轻幽灵而进行的许可更改。 blogs.msdn.microsoft.com/vcblog/2018/04/09/… /permissive- 编译器选项控制编译器接受哪些 C++ 源代码作为有效输入。这严格限于编译器前端。另一方面,/Qspectre 编译器选项会影响代码生成,即编译器后端。我不清楚/permissive- 选项对 Spectre 缓解或任何其他安全性增强有什么影响。无论如何,博客文章都没有暗示任何关系。我错过了什么?

以上是关于更新 Visual Studio 2017,现在出现编译错误 C7510:“回调”:使用依赖模板名称必须以“模板”为前缀的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2017全面上线!

Xamarin Forms不会在Visual Studio 2017中创建.csproj文件

在 Visual Studio 2017 中未发现单元测试

Intel parallel studio 2017 集成在visual studio 2013 中,现在如何集成到visual studio 2015

Visual Studio 2017 正在读取旧代码行

Prism Snippets在使用ReSharper的Visual Studio 2017中无效