【问题标题】:Visual Studio 2017 15.5 Breaks C++ TypeDefsVisual Studio 2017 15.5 打破 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

标签: c++ visual-studio visual-studio-2017


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多