2017-06-28 126 views
0

オプションの引数として行列をとる関数をC++で記述したいと思います。関数を呼び出すときにユーザーが行列を渡すと、関数によって変更されるため、参照渡しを実装しています。私はOpenCVの3.2でこれをコンパイルしようとすると、私が得る、しかしOpenCV 3:オプションの引数としてcv :: Matを渡す方法

void foo(..., cv::Mat &matrix = cv::Mat()) { 
    // code 

    return; 
} 

:このprevious questionのための受け入れ答えによると、これはのような、デフォルト値に空のマットを作ることによって行うことができます

« 'cv :: Mat'型のrvalueから 'cv :: Mat &'型の非const参照の無効な初期化»エラー。

この機能はOpenCV 2.4以降に変更されていますか、それとも別の場所にある可能性がありますか?

+0

は、残念ながら、あなたはで言われている矛盾、間違っているその質問の一部を使用するために管理しました最初の文章。 –

+1

確かに、そのリンクで受け入れられた答えは部分的に間違っています。たぶん、それを解決して、それを重複としてマークする必要がありますか? –

+0

私のオリジナルの投稿では指定しませんでしたが、この実装がいくつかの機能で使用されている他人のコード(githubから)をインポートしようとしていることが原因です。これは、私が引用したスレッドと組み合わされて、私が何とかして欠けているように動作させる要素があると私に信じさせました。たぶん私は人々を信じすぎるかもしれませんが、なぜ4000行以上のソースコードをアップロードして、それが最初に動作するかどうか確認することはありませんか? – hfs

答えて

3

私はこれらの問題の初心者ですから間違っているかもしれませんが、私の考えはここにあります。 refでオプションの引数を渡したいとします。問題は、記号&の参照は、が存在するのオブジェクトであるl値への参照であるということです。 matrixは実際のメモリアドレスが関連付けられていない一時的なオブジェクトであるr値なので、C++はあなたが書いたものを許可しません。 cv::Mat &matrix = cv::Mat()を渡す唯一の方法は、それを固定することです。const cv::Mat &matrix = cv::Mat()もちろん必要なものではありません。

最も簡単な解決策の私見はちょうどあなたがvoid foo(...args); void foo(...args, cv::Mat &matrix);

はそれがC++を使用して、非const参照を初期化することはできませんので

+2

うん、それはそれを行う方法です。実装の提供も検討してください。このようなものでなければなりません: '{c​​v :: Mat dummy; foo(...、dummy); } '。また、4桁のインデントでコードを書式設定します。 –

1

これが役に立てば幸い持つように、あなたの関数の定義をオーバーロードすることです右辺値を持つ。

は、だから、次のいずれかです。

1)参照のconstを作る - あなたは

または

2)が持っている機能で行列の内容を変更したいので、あなたに合うませんお使いのモジュールでグローバルに保存されたcv::Mat初期化変数:

static const cv::Mat g_mat = cv::Mat(); 

void foo(..., cv::Mat &matrix = g_mat) { 
関連する問題