-1

行列ライブラリとして Armadillo を使用しています。同時に、コードを開発するために OpenFrameworks を使用しています。ofxOpenCv を Armadillo と一緒に使用しようとすると、次のエラーが発生します。

/usr/include/armadillo_bits/traits.hpp: グローバル スコープ: /usr/include/armadillo_bits/traits.hpp: 'const bool arma::is_arma_type >::value' のインスタンス化: ../../.. /addons/ofxOpenCv/libs/opencv/include/opencv2/core/operations.hpp:753:23: ここからインスタンス化 /usr/include/armadillo_bits/traits.hpp:584:28: エラー: 'cv::' は /匿名型を使用しています /usr/include/armadillo_bits/traits.hpp:584:28: エラー: 'template struct arma::is_subview_elem2' をインスタンス化しようとしています /usr/include/armadillo_bits/traits.hpp:584:28: エラー: 'cv ::' is/use anonymous type . . . Armadillo と ofxOpenCv の間に競合があるように思えますが、この問題を解決する方法がわかりません。この問題を解決するためのヒントを教えてください。よろしく、 トヒド

4

1 に答える 1

2

他のライブラリを含める前に、1 つ以上のヘッダー ファイルで「using namespace arma」を呼び出して名前空間を汚染したようです ( Boost、OpenCV、および Eigen ライブラリ間の競合に対する受け入れられた回答を参照してください)。

ヘッダー ファイルで "using ... " ディレクティブを使用しないでください。それらを含める順序によっては、そのヘッダー ファイルをインクルードしてから、クラス定義が汚染されていない名前空間に依存する別のヘッダー ファイルをインクルードする可能性があるためです。

それで、それらをどこに置くのですか?C++ では、スコープがあいまいになる可能性があるため、クラス定義内にそれらを配置することはできません。クラスメンバー関数の定義内に「using namespace」を記述できるので、アルマジロのデータ構造が必要な場合はいつでもそれを行うことをお勧めします。それ以外の場合は、arma::colvec や arma::mat など、範囲を指定してください。

于 2013-03-26T20:37:56.607 に答える