【发布时间】:2016-04-12 14:53:01
【问题描述】:
我需要将(几个)类的实例关联到小整数,我称之为句柄。
我不喜欢使用预处理器宏来做这件事,所以我想我会使用模板和多重继承。
我这样定义了一个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: 错误:模板专业化需要'模板'
int Handle::nextHandle = 666;
或者,如果我尝试在 Test 类中定义它,例如:
int Test::nextHandle = 666;
std::map<int, Test*> Test::handles;
我收到另一个错误:
handle_test.cpp:20:11: 错误:“测试”中没有名为“nextHandle”的成员
int 测试::nextHandle = 666;
【问题讨论】: