Visual Studio 2017 15.5 打破 C++ TypeDefs
Posted
技术标签:
【中文标题】Visual Studio 2017 15.5 打破 C++ TypeDefs【英文标题】:Visual Studio 2017 15.5 Breaks C++ TypeDefs 【发布时间】:2018-09-18 05:23:13 【问题描述】:我遇到了一个问题,将 Visual Studio 2017 更新到 15.5 导致以前的 C++ 应用程序出现编译时错误。
具体来说,它无法像以前那样正确解析定义的类型定义,并且使用它们的构造函数和方法参数在编译时会产生语法错误。
例子:
template <class T>
class Demo
public:
typedef Demo<T> DEMO;
public:
template <class T>
class NestedDemo ;
public:
typedef DEMO::NestedDemo<T> NESTED_DEMO;
private:
NESTED_DEMO _attribute;
public:
inline DEMO(NESTED_DEMO attribute)
: _attribute(attribute)
;
错误消息是:“语法错误:在标识符'属性'之前缺少')'”以及编译错误:C2146。
编辑: 修正了示例中的错字。
编辑: 修正了另一个错字。
编辑: 这是示例无法编译的图像:
https://imgur.com/a/KO1m6fJ
【问题讨论】:
该类型定义看起来肯定不合时宜...您使用的是K
,它没有在任何地方声明。
无法复制,因为 K 未定义。您可以尝试的一件事是打开一致性模式,但在附加选项中使用 /Zc:twoPhase-
来禁用 two phase name lookup。
对不起,这不是复制粘贴的,而是作为示例输入的。我在代码中使用 K 作为模板变量,但在示例中使用 T。所以我本能地在示例中使用 T 的地方使用了 K。 @Sneftel
修复了各种其他语法错误(请参阅godbolt.org/z/qTjfI4),即使使用/permissive-
,代码也可以在MSVC 2017 上正常编译。
可能还有其他我不知道的事情发生。我能够使用提供的示例复制该问题:imgur.com/a/KO1m6fJ 捕获启用了许可设置,并且在将值设置为“NO”后,我能够毫无问题地进行编译。 @Sneftel
【参考方案1】:
现在,MSVC 将使用类型定义定义为不“[接近]符合 C++ 标准”,因此在编译时在语法上不再有效。
谢天谢地,这是我们可以禁用的。
MSVC 2017 v15.5 将此选项和其他几个选项添加到项目的属性中。虽然我不知道是否有其他方法可以解决此问题,但这是用于禁用标准一致性的选项:
“C/C++ > 语言 > 一致性模式”(默认为“是 (/permissive-)" 更新后)
将值更改为“否”将解决问题。
对于那些感兴趣的人,这里是关于更新的博客文章:
https://blogs.msdn.microsoft.com/vcblog/2017/11/15/msvc-conformance-improvements-in-visual-studio-2017-version-15-5/
这里是有关选项的文档:
https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance?view=vs-2017
【讨论】:
以上是关于Visual Studio 2017 15.5 打破 C++ TypeDefs的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2017 发布 15.5 版本,百度网盘离线安装包下载。
将 Visual Studio 升级到 15.5 后缺少 System.Net.Http
在 Visual Studio 2015 中打开 Visual Studio 2017 项目