在类声明中定义静态变量时未解析的外部符号

unresolved external symbol when static variable is defined inside the class declaration

本文关键字:符号 外部 变量 声明 定义 静态      更新时间:2023-10-16

我将直奔主题:

//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"。如果我将静态变量更改为 non const 并将其添加到源文件中:

//ComponentHolder.cpp
uint ConcreteComponentHolder1::ID = 1000;

没有问题。为什么必须明确定义后者是有道理的。但是当我使用 const 时,我必须在标头中定义它。使用常量时出现链接器错误是没有意义的。是因为标头中生成的模板函数吗?还是别的什么?

变量声明与初始化器一起放在类声明中实际上并不构成定义。你可以摆脱没有定义,只要你只接受它的价值,永远不要试图使用它作为参考。

"find"将对值的引用作为参数。这意味着您需要在某处定义一个实际变量来引用它。

您可能还想阅读此 SO 问题:在类定义中定义静态常量整数成员

相关文章: