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 は 0 として定義されるため、NULL の代入値に問題が発生します。このような問題を解決するにはどうすればよいですか?

4

2 に答える 2

4

あなたのコードは正しいです。次のすべてが機能するはずです。

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

null ポインター定数 ( 0or などNULL) は暗黙的に変換可能nullptr_tでありunique_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 に答える