C++ 当stl映射被定义为类成员的静态变量时,如何初始化它们
对于以下代码,我得到链接器错误。我想知道如何初始化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
#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注册表之前
。可能的重复可能的重复