【发布时间】:2014-01-09 10:23:14
【问题描述】:
我要开门见山了:
//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();
}
我收到未解决的外部符号错误。说无法解析“ConcereteComponentHolder1::ID”。如果我将静态变量更改为非 const 并将其添加到源文件:
//ComponentHolder.cpp
uint ConcreteComponentHolder1::ID = 1000;
没有问题。为什么必须明确定义后一个是有道理的。但是当我使用const 时,我必须在标题中定义它。使用 const 时出现链接器错误是没有意义的。是因为头文件中生成了模板函数吗?还是别的什么?
【问题讨论】:
-
“当我使用
const时,我必须在标题中定义它”。为什么? -
我刚刚意识到我可以在定义中使用 const。我只是希望有一种更简单的方法来解决这个问题。就像使用一个静态的
getId(),那么我就不需要每次都定义它了。 -
如果你真的在使用 C++11 是可能的:
constexpr uint getId() { return 1; } -
不仅没有切中要害,而且在您编辑了代码之后,这个问题就没有意义了。
标签: c++ templates c++11 static