''#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:應用更改
點選“應用”按鈕,然後點選“確定”按鈕。