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 项目

visual studio2017社区版如何空格操作?

如何在Visual Studio Code 中运行 Python

visual studio2017注册表删除