在多執行緒環境下正確實作 Singleton 模式是 C++ 開發的基本功。許多開發者會嘗試使用 Double-Checked Locking 搭配 volatile 關鍵字,但若模板類別的實作寫在 .cpp 檔中,會導致連結錯誤,因為模板在編譯階段不會實例化。
提問者的程式碼將 Singleton 模板類別的成員函數定義在 singleton.cpp 中,這會導致編譯器無法在使用該模板的編譯單元(如 main.cpp)看到完整定義,進而產生「未解析的外部符號」錯誤。
模板類別的宣告與實作都應放在標頭檔(建議命名為 .hpp)中。參考 Boost 等成熟函式庫的慣例,將所有模板程式碼置於頭文件,確保編譯器在需要時能完整實例化。此外,C++11 之後建議使用 std::call_once 或區域靜態變數(Meyers' Singleton)簡化實作,並保證執行緒安全。
singleton.h 和 singleton.cpp 合併為 singleton.hpp。volatile,改用 C++11 標準工具。private 或 delete。修正後即可避免連結錯誤,並獲得標準、安全的單例實作。