簡體   English   中英

模板超類的靜態成員定義

[英]Static member definition of template superclass

我需要將(幾個)類的實例與小整數相關聯,我稱之為handles

我不希望使用預處理器宏來執行此操作,因此我認為我會使用模板和多重繼承。

我定義了一個Handle類:

#include <map>

template<typename Key, typename Self>
class Handle
{
protected:
    static Key nextHandle;
    static std::map<Key, Self*> handles;
    Key handle;
public:
    Handle()
    {
        handles[nextHandle++] = this;
    }

    virtual ~Handle()
    {
        handles.erase(handle);
    }

    static Self * byHandle(Key handle)
    {
        typename std::map<Key, Self*>::const_iterator it = handles.find(handle);
        if(it == handles.end())
            return nullptr;
        else
            return it->second;
    }

    Key getHandle()
    {
        return handle;
    }
};

該“模式”的用法為:

class Test : public SomeSuperclass, ... , public Handle<int, Test>
{
public:
    Test();
};

Test::Test()
    : Handle()
{
}

int Handle<int, Test>::nextHandle = 666;
std::map<int, Test*> Handle<int, Test*>::handles;

問題在這里^^^我不知道如何為這些靜態變量定義存儲,我從clang ++收到此錯誤:

handle_test.cpp:17:24:錯誤:模板專業化需要'template <>'

int Handle :: nextHandle = 666;

或者,如果我嘗試在Test類中定義它,例如:

int Test::nextHandle = 666;
std::map<int, Test*> Test::handles;

我收到另一個錯誤:

handle_test.cpp:20:11:錯誤:“測試”中沒有名為“ nextHandle”的成員

int Test :: nextHandle = 666;

如果要模板專業化的靜態成員定義,則可以:

template<>
int Handle<int, Test>::nextHandle = 666;
template<>
std::map<int, Test*> Handle<int, Test>::handles;

如果要對主模板進行靜態成員定義,則可以:

template<typename Key, typename Self>
Key Handle<Key, Self>::nextHandle;
template<typename Key, typename Self>
std::map<Key, Self*> Handle<Key, Self>::handles;

您不能在派生類Test上定義它們,它們是Handle成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM