【发布时间】: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。
编辑: 修正了示例中的错字。
编辑: 修正了另一个错字。
编辑: 这是示例无法编译的图像:
【问题讨论】:
-
该类型定义看起来肯定不合时宜...您使用的是
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