Eigenの適切なパラメータタイプの控除について。Eigenの適切なテンプレート初期化
Matrix(MatrixXd
)またはVector(VectorXd
)で初期化できるクラスを作成したいとします。
// roughly
typedef Matrix<double, Dynamic, 1> VectorXd;
typedef Matrix<double, Dynamic, Dynamic> MatrixXd;
私はVectorXd
とMatrixXd
で過負荷に2つのコンストラクタを持ってしようとした場合、私はAmbiguous Constructor call
エラーを取得する:問題はMatrixXd
とVectorXd
は、両方の固有でtypedefs
であるということです。
#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
class Container {
public:
VectorXd a;
MatrixXd b;
Container(VectorXd a): a(a), b(MatrixXd::Zero(3,3)) {
cout << "Initializing with vector" << endl;
}
Container(MatrixXd b): a(VectorXd::Zero(3)), b(b) {
cout << "Initializing with matrix" << endl;
}
};
int main() {
Container x(VectorXd::Ones(4));
cout << x.a << endl;
cout << x.b << endl;
Container y(MatrixXd::Ones(4, 4));
cout << y.a << endl;
cout << y.b << endl;
return 0;
}
私が手に正確なエラー:
は、次の例を考えてみmain.cpp:23:15: error: call to constructor of 'Container' is ambiguous
Container x(Matrix<double, Dynamic, 1>::Ones(4));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:13:5: note: candidate constructor
Container(Matrix<double, Dynamic, 1> a): a(a), b(MatrixXd::Zero(3,3)) {
^
main.cpp:17:5: note: candidate constructor
Container(Matrix<double, Dynamic, Dynamic> b): a(VectorXd::Zero(3)), b(b) {
そこで質問です:どのように私は、私が電話をかけたいどのコンストラクタ解決するだろうか?
私は選択肢を好きですが、私は彼らが対処しないと思います質問。私は、最後のオプション(単一のコンストラクタ)が手元の問題に対して最も合理的な解決策であると考えています。私はコンストラクタ(コンテナ(x) 'のフレーバの何か)に型を提供する方法があることを期待していましたが、クラスをテンプレート化しなければ、 –
Manbroski
オーバーロードされた関数のテンプレート型の解決のための言語機能はありませんか?それとも、そのような機能が値(例: 'Container')のテンプレートの種類で機能しないのでしょうか? –
Manbroski
@Manbrosky、これは、さまざまな暗黙的な変換をサポートするように設計されています。通常のオーバーロード戦略と矛盾します(一般的な情報については、[here](https://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html)を参照してください)。引数型の助けを借りずに確実に関数をオーバーロードすることができます。 –