Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在类声明中定义静态变量时未解析的外部符号_C++_Templates_C++11_Static - Fatal编程技术网

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;