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
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.如何解决这样的问题?
答案 0 :(得分:4)
您的代码是正确的。以下所有内容都应该有效:
m_efb.resolved_color_tex = 0;
m_efb.resolved_color_tex = NULL;
m_efb.resolved_color_tex = nullptr;
空指针常量(如0
或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();
答案 1 :(得分:1)
永远不要初始化构造函数体中的成员。如果它们具有非平凡的构造函数,则首先调用它,而不是operator=
用于重新初始化它们。而是使用基本和成员初始化列表。像:
FramebufferManager::FramebufferManager() :
resolved_color_tex(NULL), resolved_depth_tex(NULL)
{
...
}
在你的情况下,结果是:
resolved_color_tex()
或者根本没有提及它就会调用)已经做了你想做的事。