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

时间:2014-01-09 10:23:15

标签: c++ templates c++11 static

我会说得对:

//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();
}

我得到未解决的外部符号错误。说无法解决&#34; ConcereteComponentHolder1 :: ID&#34;。如果我将静态变量更改为非const并将其添加到源文件:

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

没有问题。为什么必须明确定义后者才有意义。但是当我使用const时,我必须在标题中定义它。使用const时获取链接器错误是没有意义的。是否因为标题中生成了模板函数?还是别的什么?

1 个答案:

答案 0 :(得分:1)

将变量声明与初始化器一起放入类声明中并不会实际构成定义。只要您只使用它的值并且从不尝试将其用作参考,您就可以在没有定义的情况下离开。

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

您可能还想阅读这个问题:Defining static const integer members in class definition