読者です 読者をやめる 読者になる 読者になる

がりらぼ

WindowsRuntimeの応援ブログ

C++ってstaticなメンバ変数を作るときはクラス外で定義しなきゃらしい

C++でシングルトンなクラスを作ってたとき、

エラー    1   error LNK2001: 外部シンボル ""private: static class std::shared_ptr<class ToolkitHelper::SaveDataStore<class SaveData> > ToolkitHelper::SaveDataStore<class SaveData>::m_instance" (?m_instance@?$SaveDataStore@VSaveData@@@ToolkitHelper@@0V?$shared_ptr@V?$SaveDataStore@VSaveData@@@ToolkitHelper@@@std@@A)" は未解決です。   C:\Users\Ryota\Projects\DxGameTemplate\v2\DxGameWin\TitleScreen.obj DxGameWin


エラー   2   error LNK1120: 1 件の未解決の外部参照 C:\Users\Ryota\Projects\DxGameTemplate\v2\Debug\DxGameWin\DxGameWin.exe 1   1   DxGameWin

謎の未解決の外部参照がでてかなり悩んだんですけどどうやらC++constでないstaticなメンバ変数を宣言するときは、クラス外で一度メンバ変数を定義しておく必要があるらしい。

static なメンバ変数のせいでリンクエラーになった話 — a wandering wolf

こんな感じのstaticなメンバ変数を持つクラスを作ったとして

template<typename T>
class SaveDataStore{
public:

/*省略*/

private:
    SaveDataStore(){
        m_dataModel = ref new T();
        m_folder = KnownFolders::CameraRoll;
        m_fileName = L"SaveDataStoreData";
    }

    T^ m_dataModel;

    StorageFile^ m_file;
    StorageFolder^ m_folder;
    String^ m_fileName;
    
    static shared_ptr<SaveDataStore<T>> m_instance;

    
};

クラス外のどこかでちゃんとメンバ変数を定義しなきゃいけない

shared_ptr<SaveDataStore<SaveData>> SaveDataStore<SaveData>::m_instance;