<分区>
我要开门见山了:
//ComponentHolder.h
template<class Holder, uint ID>
class TemplateComponentHolder : public ComponentHolderInterface {
protected:
std::vector<ComponentType*> mComponents;
public:
TemplateComponentHolder() : ComponentHolderInterface(ID) {}
static const uint getStaticID() { return ID; }
};
class ConcereteComponentHolder1 : public TemplateClassHolder<ComponentType, 1000> {
public:
inline void print() { std::cout << "test"; }
};
//World.h
class World {
private:
std::map<uint, ComponentHolderInterface*> mHolders;
public:
template<class Holder> Holder * getHolder() {
auto i = mHolders.find(Holder::getStaticID());
if(i != mHolders.end())
return static_cast<Holder*>((*i));
return NULL;
}
/* ... */
};
//Main code
int main() {
World * world = new World;
world->addHolder(new ConcerteComponentHolder1);
world->getHolder<ConcreteComponentHolder1>()->print();
}
我收到 Unresolved external symbol 错误。说无法解析“ConcereteComponentHolder1::ID”。如果我将静态变量更改为非 const 并将其添加到源文件中:
//ComponentHolder.cpp
uint ConcreteComponentHolder1::ID = 1000;
没有问题。为什么必须明确定义后者是有道理的。但是当我使用 const
时,我必须在 header 中定义它。使用 const 时出现链接器错误是没有意义的。是不是因为header中生成了template function?还是其他原因?