gpt4 book ai didi

c++ - 移动构造函数调用基类移动构造函数

转载 作者:IT老高 更新时间:2023-10-28 22:34:54 27 4
gpt4 key购买 nike

我有一个基类,它基本上包含将一个类附加到任意窗口句柄(例如,HWND、HFONT),并使用一个策略类来附加/分离和销毁:

// class SmartHandle
template<typename THANDLE, class TWRAPPER, class TPOLICY>
class SmartHandle : boost::noncopyable
{
private:
TPOLICY* m_pPolicy; // Policy
bool m_bIsTemporary; // Is this a temporary window?

SmartHandle(); // no default ctor
SmartHandle(const SmartHandle<THANDLE, TWRAPPER, TPOLICY>&); // no cctor
protected:
THANDLE m_hHandle; // Handle to the underlying window

TPOLICY& policy() {return(*m_pPolicy);};

// ctor that attaches but is temporary
SmartHandle(const THANDLE& _handle, bool _temporary) : m_hHandle(_handle)
, m_bIsTemporary(_temporary)
{
m_pPolicy = new TPOLICY(reinterpret_cast<TWRAPPER&>(*this));
if(_handle)
m_pPolicy->attach(_handle);
}; // eo ctor

// move ctor
SmartHandle(SmartHandle<THANDLE, TWRAPPER, TPOLICY>&& _rhs) : m_hHandle(_rhs.m_hHandle)
, m_bIsTemporary(_rhs.m_bIsTemporary)
{
m_pPolicy = new TPOLICY(reinterpret_cast<TWRAPPER&>(*this));
m_pPolicy->attach(m_hHandle);
const_cast<SmartHandle&>(_rhs).m_hHandle = NULL;
}; // eo mtor

// dtor
virtual ~SmartHandle()
{
if(m_hHandle)
{
m_pPolicy->detach(m_hHandle);
if(!m_bIsTemporary)
m_pPolicy->destroy(m_hHandle);
m_hHandle = NULL;
};
delete(m_pPolicy);
m_pPolicy = NULL;
}; // eo dtor

请注意,我已将复制构造函数声明为私有(private)(没有实现),因为我不希望复制该类,但允许移动

我的 Window 类派生自:

    class GALLOW_API Window : SmartHandle<HWND, Window, detail::_hWndPolicy>
{
friend class Application;
private:
static LRESULT CALLBACK wndProc(HWND _hWnd, UINT _message, WPARAM _wParam, LPARAM _lParam);

// no copy/default ctor
Window();
Window(const Window&);
protected:

public:
static const String ClassName;
Window(const HWND& _hWnd);
Window(const WindowCreateInfo& _createInfo);
Window(Window&& _rhs);
virtual ~Window();
}; // eo class Window

再一次,复制默认/复制ctors。 move构造函数的实现是:

    Window::Window(Window&& _rhs) : SmartHandle(_rhs)
{
}; // eo mtor

但是,在编译过程中,移动构造函数实现的第一行出现以下错误:

1>c:\\documents\visual studio 2010\projects\gallow\gallow\window.cpp(81): error C2248: 'gallow::SmartHandle<THANDLE,TWRAPPER,TPOLICY>::SmartHandle' : cannot access private member declared in class 'gallow::SmartHandle<THANDLE,TWRAPPER,TPOLICY>'

因此,它看起来好像是在尝试调用复制构造函数(我已将其声明为私有(private))而不是移动构造函数。我在这里缺少一些简单的东西吗?

提前致谢。

编辑:修改了 mtor,所以它是非常量的,错误仍然存​​在。EDIT2:我正在使用 Visual C++ 2010。

最佳答案

其实应该是这样的。

Window::Window(Window&& _rhs) : SmartHandle( std::forward<SmartHandle>( _rhs ) )     {     };  // eo mtor 

http://msdn.microsoft.com/en-us/library/ee390914.aspx

关于c++ - 移动构造函数调用基类移动构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4390888/

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