2017-06-14 2 views
0

2つのプライオリティキュー間でデータを入れ替えようとしていて、このエラーが発生しました。私もいくつかのグーグルをして、まだ何が間違っているのか分からない。 '< lambda_07efac20ebfa61cc8bb35aebd7d81f7c> & < < lambda_07efac20ebfa61cc8bb35aebd7d81f7c >> ::演算子=(constの< < lambda_07efac20ebfa61cc8bb35aebd7d81f7c >> &')プライオリティキューを交換するときに削除された関数エラーを参照しようとしています

エラーC2280:

#include <queue> 

class Node 
{ 
public: 
    int idx; 
}; 
auto greater = [](const Node& a, const Node& b) {return a.idx > b.idx; }; 
using QUEUE = std::priority_queue<Node, std::vector<Node>, decltype(greater)>; 

void foo(QUEUE& a) 
{ 
    QUEUE b(greater); 
    a.swap(b); 
} 

int main() 
{ 

} 

はここで完全なエラーメッセージですしよう参照番号 削除された機能

+0

Visual Studioでは変わったようです。このコードは私のマシン上で正常にコンパイルされます(clang-802.0.42)。 –

+0

@Volもしそうなら、それはまたGCC 5.1.0の奇妙なものです。 –

+0

@NeilButterworth標準ライブラリ実装がここで役割を果たします。 libstdC++でコンパイルしませんが、libC++でコンパイルします。 –

答えて

1

stdlibcでstd::swapの実施++(と、Visual Studioのための最も可能性の高い、標準ライブラリ)昔ながらの割り当てを使用しています。

swap(_Tp& __a, _Tp& __b) 
{ 
    // concept requirements 
    __glibcxx_function_requires(_SGIAssignableConcept<_Tp>) 

    _Tp __tmp = __a; 
    __a = __b; 
    __b = __tmp; 
} 

逆に、libcxxはstd::moveを使用して、それを実装します。

swap(_Tp& __x, _Tp& __y) _NOEXCEPT_(is_nothrow_move_constructible<_Tp>::value && 
            is_nothrow_move_assignable<_Tp>::value) 
{ 
    _Tp __t(_VSTD::move(__x)); 
    __x = _VSTD::move(__y); 
    __y = _VSTD::move(__t); 
} 

タイプstd::priority_queueのオブジェクトをスワップするには、コンパイラをスワップする必要があります。コンパレータはコード内でラムダとして表されます。 stdlibC++でラムダをスワップすることは、コピー代入演算子を削除したために不可能です。

ちなみに、キャプチャリストが空であるため、ラムダを使用する必要はありません。シンプルな関数がその仕事をします。

bool greater(const Node& a, const Node& b) {return a.idx > b.idx;}; 
using QUEUE = std::priority_queue<Node, std::vector<Node>, decltype(&greater)>; 

void foo(QUEUE&& a) 
{ 
    QUEUE b(&greater); 
    a.swap(b); 
} 

また、移動割り当てを持つ呼び出し可能オブジェクトでラムダを置き換えることもできます。

2

Lambdasには代入演算子がなく、swap()は代入を使用します。キュー内で保持されているより大きなラムダの割り当てを使用しようとしています。

関連する問題