2

2 番目のパラメーターで merge_sort(right) を渡すための最後の最後について、「型 'std::vector&' の右辺値からの型 'std::vector&' の非定数参照の無効な初期化」エラーが発生します。

left_merged = merge_sort(left);
// right_merged = merge_sort(right);
return merge(left_merged, merge_sort(right));

関数宣言は次のとおりです。

vector<int> merge_sort(vector<int>& vec)
vector<int> merge(vector<int>& left, vector<int>& right) 

右辺値が一時オブジェクトであり、初期化子で使用されていないか、変数に割り当てられていない場合に破棄される方法についての理論を読んでいますが、本当に欲しいのは、関数を呼び出すことができる迅速で汚い解決策だけですパラメータ。

簡単な解決策はありますか?

ありがとう!

4

2 に答える 2

3

この呼び出しでは:

return merge(left_merged, merge_sort(right));

2 番目の引数は一時的なものであり、const 以外の参照を一時的なものに bing することはできません。あなたが必要

vector<int> merge(vector<int>& left, const vector<int>& right);

おそらく (この特定の例には影響しませんが)、

vector<int> merge(const vector<int>& left, const vector<int>& right);

関数内で引数のコピーを作成していることに気付いた場合は、それらを値で取得できます。たとえば、2 番目の引数をコピーする場合は、次のようにします。

vector<int> merge(const vector<int>& left, vector<int> right);.
于 2012-08-05T15:37:09.177 に答える
3

パラメーターの型をconst vector<int>&(const 参照) または単純にvector<int>(値による) に変更します。

関数内でパラメーターを変更しない場合は、最初のオプション (const 参照) を優先します。それ以外の場合は、2 番目 (値による)。関数内で引数をすぐにコピーし、元の引数を無視してコピーを操作する場合は、引数を値で取得し、コピーをスキップして、引数を直接使用します。

于 2012-08-05T15:37:31.417 に答える