C++ 链接来自静态成员的错误

C++ 链接来自静态成员的错误,c++,C++,抱歉,如果这有点复杂的话。为了缩小错误的原因,我已经取下了这个对象并删除了所有多余的内容。这就是导致我出错的原因: D3D11模块h #ifndef STUFF_H #define STUFF_H #include <map> #include <string> #include <memory> class D3D11 { public: class Shader; template<class T> class Sh

抱歉,如果这有点复杂的话。为了缩小错误的原因,我已经取下了这个对象并删除了所有多余的内容。这就是导致我出错的原因:

D3D11模块h

#ifndef STUFF_H
#define STUFF_H

#include <map>
#include <string>
#include <memory>

class D3D11
{
public:
    class Shader;
    template<class T>
    class ShaderRegister;

    typedef std::map<std::string, std::shared_ptr<Shader>(*)()> SHADER_CREATE_MAP;

private:
    static SHADER_CREATE_MAP createMap;
};

class D3D11::Shader
{

};

template<class T>
std::shared_ptr<D3D11::Shader> createShader() {return std::shared_ptr<D3D11::Shader>(new T);}

template<class T>
class D3D11::ShaderRegister
{
public:
    ShaderRegister(std::string const & s)
    {
        D3D11::createMap.insert(std::pair<std::string,std::shared_ptr<Shader>(*)()>(s, &createShader<T>));
    }
};

#endif
#如果没有东西#
#定义东西
#包括
#包括
#包括
D3D11类
{
公众:
类着色器;
模板
ShaderRegister类;
typedef std::map SHADER_CREATE_map;
私人:
静态着色器创建映射创建映射;
};
类D3D11::着色器
{
};
模板
std::shared_ptr createShader(){返回std::shared_ptr(新T);}
模板
类D3D11::ShaderRegister
{
公众:
ShaderRegister(标准::字符串常量&s)
{
D3D11::createMap.insert(std::pair,&createShader));
}
};
#恩迪夫
只是对这一切的一个很快的解释。有一个名为d3d11的类,它包含两个类。首先是着色器类,它可以派生和实现哪些类,但此处留空,因为它的内容与问题无关。然后我有一个对应于函数指针的字符串索引映射

ShaderRegister对象是派生着色器类中的静态私有成员。然后在外部调用构造函数,以便在该索引处存储指定的索引和指向createShader()的指针。通过执行此操作,调用索引将调用此模板化函数,返回该派生着色器的实例

但是,当尝试派生着色器对象并创建ShaderRegister实例并尝试调用其构造函数时,我遇到了链接错误。看一看:

#ifndef DIFFUSE_SHADER
#define DIFFUSE_SHADER

#include "d3d11module.h"

class DiffuseShader : public D3D11::Shader
{
    static D3D11::ShaderRegister<DiffuseShader> reg;
};

D3D11::ShaderRegister<DiffuseShader> DiffuseShader::reg("DiffuseShader");

#endif 
\ifndef漫反射着色器
#定义漫反射着色器
#包括“d3d11module.h”
类DiffuseShader:公共D3D11::着色器
{
静态D3D11::ShaderRegister reg;
};
D3D11::ShaderRegister DiffuseShader::reg(“DiffuseShader”);
#恩迪夫
这样做会导致相当痛苦的链接错误

main.obj:错误LNK2001:未解析的外部符号“private:静态类std::map D3D11::createMap”(?createMap@D3D11@@0V$map@V?$basic_string@DU?$char_traits@D@性病病毒$allocator@D@2@@std@@P6A?AV?$共享_ptr@VShader@D3D11@@@tr1@2@XZU$less@V?$basic_string@DU?$char_traits@D@性病病毒$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@性病病毒$allocator@D@2@@std@@P6A?AV?$共享_ptr@VShader@D3D11@@@tr1@2@XZ@std@@@2@@std@@A) 


不过,我想它想说的是,d3d11类中的静态映射对象在某些时候使用时是未定义的。但我认为静态对象是在程序开始时构造的。那么发生了什么呢?

静态成员与其他所有内容一样在类中声明,但它们也必须在一个且只有一个对象中定义ne源(.cpp)文件。这与声明成员函数原型,然后在其他地方定义函数体相同

SHADER_CREATE_MAP D3D11::createMap;

静态成员在类中声明,与其他所有内容一样,但它们也必须在一个且仅在一个源(.cpp)文件中的某个位置定义。这与声明成员函数原型,然后在其他位置定义函数体相同

SHADER_CREATE_MAP D3D11::createMap;

哇,我猜我脑子里有个地方,静态成员是含蓄的。当C++工作时,这种想法并不友好:P. Will接受答案时,它让我感到惊讶,我想我在头脑中得到了一些静态成员定义的隐含性。这种思维在使用C++时不太友好:P. Will。当它允许我回答时,接受它