2016-12-16 5 views
0

私は並行性についてこのビデオシリーズに従っており、その人はクリティカルセクションについて話し始めました。私も(再び私はのみ)コードの面倒なセクションを含めています。このクラスで同じエラーが生じています削除されたコンストラクタ

class auto_lock 
{ 

    T& m_lock; 
public: 
    auto_lock(auto_lock& const) = delete; 
    auto_lock(auto_lock&&) = delete; 
    auto_lock& operator=(auto_lock& const) = delete; 
    auto_lock& operator=(auto_lock&&) = delete; 
    auto_lock(T& lock) throw() : 
     m_lock{ lock } 
    { 
     m_lock.enter(); 
    } 
}; 

::私たちは(私は面倒な部分が含まれます「auto_lock」と呼ばれるテンプレートクラスを作りました

int main() 
{ 
    auto lock = critical_section {}; //error here 
    { 
     auto guard = auto_lock<critical_section>{ lock };//and here 
    } 
}; 

特定のエラーがある「」CRITICAL_SECTION :: CRITICAL_SECTION(CRITICAL_SECTION &:私の主な機能には

class critical_section 
{ 
    CRITICAL_SECTION m_lock; 

public: 

    critical_section(critical_section& const) = delete; 
    critical_section& operator=(critical_section& const) = delete; 
    critical_section& operator=(critical_section&&) = delete; 
    critical_section(critical_section&&) = delete; 

    critical_section() throw() 
    { 
     InitializeCriticalSection(&m_lock); 
    } 
}; 

2105)」(42行目で宣言)は参照できません。削除された関数です。「auto_lock :: auto_lock(auto_lock & &)[T = critical_section]」「 どうしますか?

+1

Do 'auto_lock guard {lock}' – 0x499602D2

+0

'='の右側に 'critical_section'を置くことは意味がありません。 –

+0

'auto_lock&const'と' critical_section&const'はそれぞれ1) 'const auto_lock&'と 'const critical_section&'、または2) 'auto_lock const&'と 'critical_section const&'のいずれかです。元のコードはconst以外のオブジェクトへのconst参照を受け取りますが、代わりにconstオブジェクトへの参照(constまたはnon-const)が必要です。 –

答えて

4

これらのタイプはコピー不可能で移動不可能なので、ほとんど常に自動には失敗します。

int main() 
{ 
    critical_section lock{}; 
    { 
     auto_lock<critical_section> guard{ lock }; 
    } 
} 

(あなたはこれを好きではない場合は、C++ 17の必須コピーの省略が実装されるのを待つ)

なぜこれがコピーを必要としていますか?このコードはコピーを作成する可能性は低いものの、コピー/移動コンストラクタはコードが機能するためにはアクセス可能でなければなりません。あなたはコードが

auto guard = auto_lock<critical_section>{ lock };//and here 

通話

critical_section::critical_section(critical_section&&) 

を呼び出すlockm_lockを構築しようとし

auto_lock::auto_lock(T& lock) 

を何トレースする場合とauto lock = critical_section{};critical_section lock = critical_section{};

+0

"*' auto '= critical_section {};'は 'critical_section lock {critical_section {}} 'と同じ' critical_section lock = critical_section {}; '*'と同じです。 ; 'は、一時オブジェクトを入力としてコピー/移動 - 構成です。 –

+0

@RemyLebeauそれはコピー/移動の構造です(どちらのオプションにもアクセス可能なコンストラクタがないのでコピーも移動もありません) –

+0

ありがとうございます。しかし、私はまだコードにエラーがないことを理解していません。彼は別のバージョンを使用していますか、それとも重要なのでしょうか? – deadbird11

-1

と同じです削除されました。

+0

'auto_lock'では、' m_lock'メンバと 'lock'コンストラクタパラメータは両方とも' T& 'として宣言されていますので' m_lock {lock} 'は' m'ロックを 'T'オブジェクトとして構築していません。 'auto_lock'コンストラクタに渡された既存オブジェクトのポイントへの参照。 –

+0

'auto lock = critical_section {};'は 'critical_section {}'で作成された一時オブジェクトから 'lock'をコピーしようとしていますが、コピーコンストラクタは削除されています。 –

+0

私はあなたが基本的に同じことを話していると思います。 –

関連する問題