2

固有行列の operator() 関数への関数ポインタが必要です。具体的には、単一のインデックスを取る operator() Eigen の VectorXi 行列クラスです。つまり、呼び出すときに使用している演算子は次のとおりです。

VectorXi V(1);
...
VectorXi::Index i = 0;
VectorXi::Scalar& vi = V(i); // <-- this one

私が試したことは次のとおりです。

VectorXi::Scalar& (*value_at_i)(VectorXi::Index i ) = &VectorXi::operator();

しかし、これは私に非常に長いエラーを与えます:

...: error: no matches converting function ‘operator()’ to type ‘int& (*)(Eigen::DenseIndex)’
/usr/local/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h:124: error: candidates are: typename Eigen::internal::conditional<(bool)((Eigen::internal::traits<T>::Flags & Eigen::LvalueBit)), const typename Eigen::internal::traits<T>::Scalar&, typename Eigen::internal::conditional<Eigen::internal::is_arithmetic<typename Eigen::internal::traits<T>::Scalar>::value, typename Eigen::internal::traits<T>::Scalar, const typename Eigen::internal::traits<T>::Scalar>::type>::type Eigen::DenseCoeffsBase<Derived, 0>::operator()(typename Eigen::internal::traits<T>::Index, typename Eigen::internal::traits<T>::Index) const [with Derived = Eigen::Matrix<int, -0x00000000000000001, 1, 0, -0x00000000000000001, 1>]
/usr/local/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h:184: error:                 typename Eigen::internal::conditional<(bool)((Eigen::internal::traits<T>::Flags & Eigen::LvalueBit)), const typename Eigen::internal::traits<T>::Scalar&, typename Eigen::internal::conditional<Eigen::internal::is_arithmetic<typename Eigen::internal::traits<T>::Scalar>::value, typename Eigen::internal::traits<T>::Scalar, const typename Eigen::internal::traits<T>::Scalar>::type>::type Eigen::DenseCoeffsBase<Derived, 0>::operator()(typename Eigen::internal::traits<T>::Index) const [with Derived = Eigen::Matrix<int, -0x00000000000000001, 1, 0, -0x00000000000000001, 1>]
/usr/local/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h:405: error:                 typename Eigen::internal::traits<T>::Scalar& Eigen::DenseCoeffsBase<Derived, 1>::operator()(typename Eigen::internal::traits<T>::Index) [with Derived = Eigen::Matrix<int, -0x00000000000000001, 1, 0, -0x00000000000000001, 1>]
/usr/local/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h:347: error:                 typename Eigen::internal::traits<T>::Scalar& Eigen::DenseCoeffsBase<Derived, 1>::operator()(typename Eigen::internal::traits<T>::Index, typename Eigen::internal::traits<T>::Index) [with Derived = Eigen::Matrix<int, -0x00000000000000001, 1, 0, -0x00000000000000001, 1>]

この演算子への関数ポインタを取得する正しい方法は何ですか?

4

3 に答える 3

2

メンバー関数への関数ポインターを作成することはできません。C++ はメンバー関数へのポインターをサポートしていますが、おそらくそれはあなたが望むものではありません。規則では、関数の代わりにファンクターを渡します。ファンクターは、演算子 () が実装されたクラスです。これはまさにクラスにあるものなので、元のクラスをファンクターとして渡すだけです。

編集: 以下は、クラス T の () 演算子での C++ のメンバー関数へのポインターの例です。

void (T::*op)(int) = &T::operator();
T t;
(t.*op)(5);
于 2012-02-09T10:40:06.927 に答える
-1

解決策は、正しいオーバーロードを示すことです。あなたが見ているのは、オーバーロードの解決が失敗していることです。候補は 4 つありますが、 の署名に一致するものはありませんvalue_at_i

あなたはほぼ確実に欲しいEigen::internal::traits<T>::Scalar& Eigen::DenseCoeffsBase<Derived, 1>::operator()(typename Eigen::internal::traits<T>::Index) [with Derived = Eigen::Matrix<int, -0x00000000000000001, 1, 0, -0x00000000000000001, 1>].

意地悪なサインです。ただし、次の 3 つの重要な部分があることに注意してください。

  • リターンタイプEigen::internal::traits<T>::Scalar&
  • クラスタイプEigen::DenseCoeffsBase<Derived, 1>
  • 引数の型Eigen::internal::traits<T>::Index

この場合のオーバーロード選択に関連するルールは非常に具体的です: 「選択された関数は、コンテキストで必要なターゲット型の関数型と同じ型を持つ関数です。」. 調整は行われておらず、これを示すメモ (13.4/7) さえあります。

したがって、私の現在の仮定は、問題はクラスの typeEigen::DenseCoeffsBase<Derived, 1>にありますが、それは ではありませんVectorXi。他の 2 つの型は、新しい型を導入しない typedef です。

于 2012-02-09T14:30:45.527 に答える