2

私はboost1.53でコルーチンを使用しています。以下のコードを参照してください。

boost::coroutines::coroutine<int()> f(std::bind(foo, ...));
std::vector<decltype(f)> container; // it can be compiled
container.push_back(f); // compile error

エラー:

no matching function for call to ‘std::vector<boost::coroutines::coroutine<int(),0> >::vector(paracel::coroutine<int>&)’

更新:「boost::coroutines::coroutine」にコピー構築/演算子がないため、エラーが発生しました。ここでは、インデックスを「f」にマップするコンテナに「f」を保存したいだけです。

unordered_map と emplace_back も試しましたが、まだ動作しません!

C++ で動作させるにはどうすればよいですか?

Update2: vector,unordered_map, map を emplace_back, push_back, std::move と一緒に試してみましたが、すべて失敗しました。しかし、list と deque は push_back/emplace_back と std::move で問題ありません:

std::deque<decltype(f)> container1;
container.push_back(std::move(f)); // ok
std::deque<decltype(f)> container2;
container.emplace_back(std::move(f)); // ok
std::list<decltype(f)> container3;
container.push_back(std::move(f)); // ok
std::list<decltype(f)> container4;
container.emplace_back(std::move(f)); // ok

なんで?

4

4 に答える 4

3

たとえばこの参照を確認すると、含まれているタイプが表示されます

T はCopyAssignableおよびCopyConstructibleの要件を満たさなければなりません。

要素に課せられる要件は、コンテナーで実行される実際の操作によって異なります。一般に、要素の型がMoveConstructibleおよびMoveAssignableの要件を満たす必要がありますが、多くのメンバー関数はより厳しい要件を課しています。

coroutineクラスを確認すると、コピー代入演算子もコピー コンストラクターも含まれていないことがわかります。それらの移動バリアントはありますが、上記の 2 番目の段落で述べたように、常に十分であるとは限りません。

于 2013-11-11T07:11:25.910 に答える
0

2 つの可能性:

1.) freestore にコルーチンを割り当てます。

std::vector< shared_ptr< coroutine< void >::pull_type > v;
v.push_back( new coroutine< void >::pull_type(...) );

2.) moveaware コンテナー ( boost.container )を使用します。

boost::container::vector< coroutine< void >::pull_type > v;
coroutine< void >::pull_type c(...)
v.push_back( boost::move( c) );
于 2013-11-11T10:46:05.103 に答える