0

framebufferd3d11.h 的片段

namespace dx11 {
...
class FramebufferManager : public FramebufferManagerBase
{
public:
   ...
private:
   ...
   static struct Efb
   {
      ...
      std::unique_ptr<D3DTexture2D> resolved_color_tex;
      std::unique_ptr<D3DTexture2D> resolved_depth_tex;
   } m_efb;
};
} //namespace

framebufferd3d11.cpp 的片段

namespace DX11
{
...
FramebufferManager::Efb FramebufferManager::m_efb;
...
FramebufferManager::FramebufferManager()
{
   ...
   m_efb.resolved_color_tex = NULL;
   m_efb.resolved_depth_tex = NULL;
}
} //namespace

如果我用 icc 编译,我会遇到 NULL 赋值的问题,因为 NULL 被定义为 0。我该如何解决这样的问题?

4

2 回答 2

4

你的代码是正确的。以下所有内容都应该有效:

m_efb.resolved_color_tex = 0;
m_efb.resolved_color_tex = NULL;
m_efb.resolved_color_tex = nullptr;

空指针常量(如0or NULL)可隐式转换为nullptr_tunique_ptr具有一个赋值运算符,该运算符采用nullptr_t. 如果您正在使用的 ICC 版本尚不支持nullptr,这可以解释为什么分配NULL对您不起作用。

使用以下方法可能会更好reset()

m_efb.resolved_color_tex.reset(NULL);

或者,因为NULL是默认参数:

m_efb.resolved_color_tex.reset(); 
于 2011-04-12T05:47:43.503 回答
1

永远不要在构造函数的主体中初始化成员。如果它们具有非平凡的构造函数,则首先调用它,然后operator=使用它来重新初始化它们。而是使用基本和成员初始化列表。喜欢:

FramebufferManager::FramebufferManager() :
   resolved_color_tex(NULL), resolved_depth_tex(NULL)
{
   ...
}

在你的情况下,事实证明:

  1. 默认构造函数(如果您提及resolved_color_tex()或根本不提及它,则调用它)已经做了您想要的。
  2. 对于原始类型,如果您明确提及它们,它们将被零初始化。因此,任何指针成员,无论是什么类型,如果在初始化列表中明确提及,都将为 NULL,您不必再考虑它了。
于 2011-04-12T07:12:34.150 回答