3

私が持っているのは、基本的に へのポインタを保持する std::mapViewsです。

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 が宣言されているため、デフォルトの move ctor がありません。したがって、適切な ctor がない場合は、メンバーを移動したり、move-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 に移動 ctor が宣言されているかどうかを尋ねたように。私はそれが実際に1つもなかったことを見ました:

ScSetupPage3 には、非プリミティブ ctor が宣言されているため、デフォルトの move ctor がありません。したがって、適切な ctor がない場合は、そのメンバーを移動したり、move-ctor を宣言したりできたとしても、コピーされて移動されません。

于 2013-09-14T17:48:53.247 に答える