''#include
std::mutex m_mutex;
...
std::lock_guard lock(m_mutex); //A
..
以上代码编译 提示 C2955 ,没有模板参数
改为
std::lock_guardstd::mutex lock(m_mutex); 编译成功
但是 有的代码 用A处的写法,编译就成功。
原因
虽然 C++17 引入了类模板参数推导(CTAD, Class Template Argument Deduction),使得在某些情况下可以省略模板参数
但 std::lock_guard 并不是一个支持 CTAD 的类模板。因此,你需要显式指定模板参数
在 Visual Studio 2017 中,默认情况下是支持 C++17 标准的,因此类模板参数推导(CTAD, Class Template Argument Deduction)是可用的。你不需要特别设置来启用 CTAD。
然而,如果你遇到问题,可能是因为你的项目配置没有启用 C++17 标准。你可以通过以下步骤来确保你的项目使用 C++17 标准:
设置步骤
步骤 1:打开项目属性
在 Visual Studio 中,右键点击你的项目,然后选择“属性”。
步骤 2:设置 C++ 语言标准
在左侧的树形菜单中,选择“配置属性” -> “C/C++” -> “语言”。
在右侧的“C++ 语言标准”下拉菜单中,选择“ISO C++17 标准 (/std:c++17)”。
步骤 3:应用更改
点击“应用”按钮,然后点击“确定”按钮。