gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:23:07 24 4
gpt4 key购买 nike

抱歉,如果这变得有点复杂。我已经拿走了这个对象并删除了所有多余的东西以缩小错误原因的范围。这就是导致我的错误的原因:

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 的类,其中包含几个类。首先shader类是哪些类能够派生和实现,但是这里留空是因为它的内容与问题无关。然后我有一个字符串索引映射,对应于函数指针。

ShaderRegister 对象是派生着色器类中的静态私有(private)成员。然后就在外面,调用构造函数,以便将指定的索引和指向 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

这样做会导致看起来很痛苦的链接错误。

main.obj : error LNK2001: unresolved external symbol "private: static class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::tr1::shared_ptr<class D3D11::Shader> (__cdecl*)(void),struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::tr1::shared_ptr<class D3D11::Shader> (__cdecl*)(void)> > > D3D11::createMap" (?createMap@D3D11@@0V?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6A?AV?$shared_ptr@VShader@D3D11@@@tr1@2@XZU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6A?AV?$shared_ptr@VShader@D3D11@@@tr1@2@XZ@std@@@2@@std@@A)

不过,我认为它想说的是 d3d11 类中的静态 map 对象在某些时候使用时是未定义的。但我认为静态对象是在程序开始时构造的。那么这是怎么回事?

最佳答案

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

SHADER_CREATE_MAP D3D11::createMap;

关于c++ - 链接来自静态成员的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11424830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com