我遇到一个问题,随后将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)
{ }
};
错误消息将是:“语法错误:标识符'attribute'之前缺少')'”,并显示编译错误:C2146。
编辑: 修复了示例中的错字。
编辑: 修复了另一个错字。
编辑: 这是示例无法编译的图像:
答案 0 :(得分:0)
使用类型定义现在被MSVC定义为不“接近C ++标准一致性”,因此在编译时在语法上不再有效。
非常感谢,我们可以禁用此功能。
MSVC 2017 v15.5将此选项以及其他几个选项添加到了项目的属性中。虽然我不知道是否还有其他解决方法,但这是用于禁用标准符合性的选项:
“ C / C ++>语言>一致性模式”(默认为“是” (/ permissive-)”更新后)
将值更改为“否”将解决问题。
对于那些感兴趣的人,这里是有关更新的博客文章:
这是有关该选项的文档:
https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance?view=vs-2017