C++ 当stl映射被定义为类成员的静态变量时,如何初始化它们

C++ 当stl映射被定义为类成员的静态变量时,如何初始化它们,c++,stl,C++,Stl,对于以下代码,我得到链接器错误。我想知道如何初始化stl映射 #include <iostream> #include <map> #include <string> class Test { public: Test() { } static void setSerializer(void* fnptr, std::string className) { m_registry.insert(std::make_pair(classNam

对于以下代码,我得到链接器错误。我想知道如何初始化stl映射

#include <iostream>
#include <map>
#include <string>

class Test {
public:
  Test() {
  }
  static void setSerializer(void* fnptr, std::string className) {
    m_registry.insert(std::make_pair(className, fnptr));
  }
  static void* getSerializer(std::string className) {
    return m_registry.find(className)->second;
  }
private:
  static std::map<std::string, void*> m_registry;
};

void fn() {
}

int main() {
  Test::setSerializer(&fn,"abc");
  return 0;
}
#包括
#包括
#包括
课堂测试{
公众:
测试(){
}
静态void setSerializer(void*fnptr,std::string className){
m_registry.insert(std::make_pair(className,fnptr));
}
静态void*getSerializer(std::string类名称){
返回m_registry.find(className)->second;
}
私人:
静态std::映射m_注册表;
};
无效fn(){
}
int main(){
测试:设置序列化器(&fn,“abc”);
返回0;
}

< />代码> 您需要在类实现中定义<强> >静态变量——就像您为ExtC+C++变量所做的那样。仅仅在课堂上声明是不够的! 要执行此操作,请将以下代码放入.cpp文件:

std::map<std::string, void*> Test::m_registry;
std::map Test::m_注册表;

< />代码> 您需要在类实现中定义<强> >静态变量——就像您为ExtC+C++变量所做的那样。仅仅在课堂上声明是不够的! 要执行此操作,请将以下代码放入.cpp文件:

std::map<std::string, void*> Test::m_registry;
std::map Test::m_注册表;

您需要在.cpp文件中初始化静态成员。通常我们在.h文件中声明类,并将定义放入.cpp文件中。我对您的代码做了一些增强,如下所示:

测试h

class Test 
{
public:
  Test() { }
  static void setSerializer(std::string className, void* fnptr); // I swap the order of parameter. it makes more sense to have name and pointer pair
  static void* getSerializer(std::string className);

private:
  static std::map<std::string, void*> m_registry;
};
类测试
{
公众:
Test(){}
静态void setSerializer(std::string className,void*fnptr);//我交换了参数的顺序。使用名称和指针对更有意义
静态void*getSerializer(std::string className);
私人:
静态std::映射m_注册表;
};
Test.cpp

std::map<std::string, void*> Test::m_registry;   // initialize static member here

void Test::setSerializer(std::string className, void* fnptr)
{
  m_registry.insert(std::make_pair(className, fnptr));
}

void* Test::getSerializer(std::string className) {    
  auto iter =  m_registry.find(className);   // check if iterator is valid 
  if (iter != m_registry.end() )
  {
    return (*iter).second;
  }
  return NULL;
}
std::map Test::m_registry;//在此初始化静态成员
void测试::setSerializer(标准::字符串类名称,void*fnptr)
{
m_registry.insert(std::make_pair(className,fnptr));
}
void*Test::getSerializer(std::string类名称){
auto iter=m_registry.find(className);//检查迭代器是否有效
if(iter!=m_registry.end())
{
返回(*iter)。第二;
}
返回NULL;
}

您需要在.cpp文件中初始化静态成员。通常我们在.h文件中声明类,并将定义放入.cpp文件中。我对您的代码做了一些增强,如下所示:

测试h

class Test 
{
public:
  Test() { }
  static void setSerializer(std::string className, void* fnptr); // I swap the order of parameter. it makes more sense to have name and pointer pair
  static void* getSerializer(std::string className);

private:
  static std::map<std::string, void*> m_registry;
};
类测试
{
公众:
Test(){}
静态void setSerializer(std::string className,void*fnptr);//我交换了参数的顺序。使用名称和指针对更有意义
静态void*getSerializer(std::string className);
私人:
静态std::映射m_注册表;
};
Test.cpp

std::map<std::string, void*> Test::m_registry;   // initialize static member here

void Test::setSerializer(std::string className, void* fnptr)
{
  m_registry.insert(std::make_pair(className, fnptr));
}

void* Test::getSerializer(std::string className) {    
  auto iter =  m_registry.find(className);   // check if iterator is valid 
  if (iter != m_registry.end() )
  {
    return (*iter).second;
  }
  return NULL;
}
std::map Test::m_registry;//在此初始化静态成员
void测试::setSerializer(标准::字符串类名称,void*fnptr)
{
m_registry.insert(std::make_pair(className,fnptr));
}
void*Test::getSerializer(std::string类名称){
auto iter=m_registry.find(className);//检查迭代器是否有效
if(iter!=m_registry.end())
{
返回(*iter)。第二;
}
返回NULL;
}

我肯定你的意思是
测试::
MU注册表之前。
我肯定你的意思是
测试:
MU注册表之前
。可能的重复可能的重复