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

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

我收到 Unresolved external symbol 错误。说无法解析“ConcereteComponentHolder1::ID”。如果我将静态变量更改为非 const 并将其添加到源文件中:

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

没有问题。为什么必须明确定义后者是有道理的。但是当我使用 const 时,我必须在 header 中定义它。使用 const 时出现链接器错误是没有意义的。是不是因为header中生成了template function?还是其他原因?

最佳答案

在类声明中将变量声明和初始化程序放在一起实际上并不构成定义。只要您只接受它的值(value)并且从不尝试将其用作引用,您就可以在没有定义的情况下逃脱。

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

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

关于c++ - 在类声明中定义静态变量时未解析的外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21017490/

相关文章:

c++ - 什么时候使用vtable?

c++ - 链接 : fatal error LNK1181: cannot open input file 'libclamav.lib'

c++ - 如何在 STL 容器中存储具有抽象模板类型的抽象模板类?

C++11 替代 boost::checked_delete

c++ - 如果存储 unique_ptr,则不会构建 std::queue 的线程安全包装器,但 std::queue 可以工作

c++ - 为什么在多个 cpp 文件中包含相同的 header 然后它们的编译工作?

c++ - 如何将字符串转换为字符矩阵

c++ - header 中的模板显式实例化

c++ - 元组中的前向声明和交叉引用

c++ - std::array<char, N> 的大小是多少?