C++ 在类声明中定义静态变量时未解析的外部符号
我要直截了当地说:C++ 在类声明中定义静态变量时未解析的外部符号,c++,templates,c++11,static,C++,Templates,C++11,Static,我要直截了当地说: //ComponentHolder.h template<class Holder, uint ID> class TemplateComponentHolder : public ComponentHolderInterface { protected: std::vector<ComponentType*> mComponents; public: TemplateComponentHolder() : ComponentHol
//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();
}
没问题。为什么后者必须明确定义,这是有道理的。但是当我使用
const
时,我必须在标题中定义它。在使用const时获取链接器错误是没有意义的。是不是因为标头中生成了模板函数?还是别的什么?在类声明中放置变量声明和初始化器实际上并不构成定义。你可以不使用定义,只要你只接受它的值,而不尝试将它用作参考
“find”将对值的引用作为参数。这意味着您需要在某处定义一个实际变量来引用它
您可能还想阅读此SO问题:“当我使用
常量时,我必须在标题中定义它”。为什么?我刚刚意识到我可以在定义中使用const。我只是希望有一个更简单的方法来解决这个问题。就像使用一个静态的getId()
,那么我就不需要每次都定义它。如果你真的使用C++11,那么有可能:constexpr uint getId(){return 1;}
不仅没有切中要害,而且在你编辑代码之后,这个问题没有什么意义。一个问题。我没有使用ID作为变量,而是创建了一个getStaticID()静态函数,每个子类都定义了它。请检查我编辑的新代码。getStaticId按预期工作,但我想知道它是否只是我的编译器正确链接的,还是一个有效的代码?派生类可以访问父类的静态函数吗?因为您使用的模板函数中的特定类是参数化的,所以您访问的是派生类的静态方法,而不是父类。还是我误解了你的问题?顺便说一句,最好不要这样编辑问题。现在,这个问题和答案对任何正在寻找这类问题的人来说都没有意义。
//ComponentHolder.cpp
uint ConcreteComponentHolder1::ID = 1000;