3

我所拥有的基本上是一个 std::map 持有指向Views.

std::map<string,View*>  myViews;

template<typename T>
bool addView( string assocName , T&& view )
{
    typedef typename std::remove_reference<T>::type T2;
    typedef typename T2::View dummy; // check if T is subclass of 'View'

    // Remove any Current View
    View* &data = myViews[assocName]; // reference to pointer

    if( data )
        delete data; // Delete Current associated view

    // Insert the new View
    data = new T2( std::move(view) ); // <-- Here is the error
}

'addView' 的调用方式如下:

viewSwitcher.addView( "3" , ScSetupPage3() );

我的问题是“ScSetupPage3”类没有复制ctor,但“addView”试图调用它!?

这是错误消息,我的 GNU GCC 给了我:

error: use of deleted function 'ScSetupPage3::ScSetupPage3(const ScSetupPage3&)'

解决方案: ScSetupPage3 没有默认移动 ctor,因为它声明了一个非原始 ctor。因此,即使它的成员可以被移动甚至声明了一个 move-ctor,它也会被复制并且不会在缺少适当的 ctor 时移动。

4

2 回答 2

1

std::move就是你要找的。如果可能的话,它基本上是一个右值的强制转换。

从我发现的一个实现中,您似乎只犯了一个小错误,尝试自己进行转换:

template<class T> 
typename remove_reference<T>::type&&
std::move(T&& a) noexcept
{
  typedef typename remove_reference<T>::type&& RvalRef;
  return static_cast<RvalRef>(a);
} 
于 2013-09-14T17:22:40.197 回答
1

正如 juanchopanza 询问 ScSetupPage3 是否声明了一个 move ctor。我看到了,它确实没有:

ScSetupPage3 没有默认移动 ctor,因为它声明了一个非原始 ctor。因此,即使它的成员可以被移动甚至声明了一个 move-ctor,它也会被复制并且不会在缺少适当的 ctor 时移动。

于 2013-09-14T17:48:53.247 回答