首页 > 解决方案 > 模板类中的 lambda 函数上的 __declspec(noinline) 在 VS2017 中引发语法错误

问题描述

在尝试使用断言宏调试问题时,我遇到了这个问题。在模板类中的 lambda 函数上使用 __declspec(noinline) 会在 Visual Studio 2017 中生成语法警告:

错误 C2760:语法错误:意外标记“__declspec”,应为“{”

这是失败的代码:

template<class R>
class test
{
public:
    void DoStuff()
    {
        []() __declspec(noinline) { }; // syntax error
    }
};

int WinMain(void)
{
    return 0;
}

如果我转到我的项目设置并在项目属性对话框的常规部分将我的平台工具集从 v141 (vs2017) 切换到 v140 (vs2015),错误就会消失。

如果我将类更改为不是模板类,它也会正确编译:

class test
{
public:
    void DoStuff()
    {
        []() __declspec(noinline) { }; // compiles fine
    }
};

int WinMain(void)
{
    return 0;
}

我很好奇为什么使用 v141 平台工具集不会成功。是否有其他项目设置可能会影响这一点?

标签: c++templatesvisual-c++lambdadeclspec

解决方案


我能够通过将 Visual Studio 2017 更新到最新版本 (15.9.7) 来解决此问题。以前我运行的是 15.6.7 版。感谢所有关注和评论的人!:)


推荐阅读