2

ここで起こっていることのニュアンスを理解しているかどうか確信が持てず、説明を期待していました.

テンプレート化されたラッパーからいくつかのオーバーロードされた関数を呼び出していますlapack_gesvd_nothrow。そこから、次のような個々の fxn を呼び出しています。

inline void lapack_gesvd(char *jobu, char *jobvt, 
  int *m, int *n, 
  float *a, int *lda,   
  float *s, 
  float *u, int *ldu,  
  float *vt, int *ldvt,
  float *work,  int *lwork, 
  int *info) {
  sgesvd_(jobu, jobvt, m, n, 
        a, lda, s, u, ldu, 
        vt, ldvt, work, lwork, 
        info);
}
inline void lapack_gesvd(char *jobu, char *jobvt, 
  int *m, int *n, 
  nm::Complex64 *a, int *lda,   
  nm::Complex64 *s, 
  nm::Complex64 *u, int *ldu,  
  nm::Complex64 *vt, int *ldvt,
  nm::Complex64 *work,  int *lwork, float *rwork,
  int *info) {
  cgesvd_(jobu, jobvt, m, n,
      a, lda, s, u, ldu,
      vt, ldvt, work, lwork,
      rwork, info);
}

2 番目のタイプのオーバーロードを宣言するまでは機能していましたが (float と double でオーバーロードしましたが、問題ありませんでした)、いくつかのエラーがスローされ、引数がうまくカウントされていないようです。

次のように引数を取った関数から呼び出します。

template <typename DType, typename CType>
static int lapack_gesvd_nothrow(char *jobu, char *jobvt, 
  int m, int n, 
  void *a, int lda,   
  void *s, 
  void *u, int ldu,  
  void *vt, int ldvt,
  void *work,  int lwork,
  int info, void *rwork) {
....
DType* UPCASE = reinterpret_cast<DType*>(lowercase);
....

  if (typeid(DType) == typeid(CType)) {
    lapack_gesvd(jobu, jobvt, &m, &n, A, &lda, S, U, &ldu, VT, &ldvt, WORK, &lwork, &info);
  } else {
    CType* RWORK = reinterpret_cast<CType*>(rwork);
    lapack_gesvd(jobu, jobvt, &m, &n, A, &lda, S, U, &ldu, VT, &ldvt, WORK, &lwork, RWORK, &info);
  }

私は文字通りreinterpret_casts2つの間だけを行います。

どうやら探している fxn は次のとおりです。

error: no matching function for call to ‘lapack_gesvd(char*&, char*&, int*, int*, float*&, int*, float*&, float*&, int*, float*&, int*, float*&, int*, float*&, int*)

そして、ここに候補の一致があります:

candidates are:
note: void nm::math::lapack_gesvd(char*, char*, int*, int*, float*, int*, float*, float*, int*, float*, int*, float*, int*, int*) 
note:    candidate expects 14 arguments, 15 provided
void nm::math::lapack_gesvd(char*, char*, int*, int*, double*, int*, double*, double*, int*, double*, int*, double*, int*, int*) 
note:   candidate expects 14 arguments, 15 provided
void nm::math::lapack_gesvd(char*, char*, int*, int*, nm::Complex64*, int*, nm::Complex64*, nm::Complex64*, int*, nm::Complex64*, int*, nm::Complex64*, int*, float*, int*)
note:   no known conversion for argument 5 from ‘float*’ to ‘nm::Complex64* {aka nm::Complex<float>*}’

error: invalid conversion from 'int' to 'int*'逆参照なしで必要であり、この最新の過負荷の前に必要で あると思われるのに、なぜ逆参照が表示されるのか、私は当惑しています。

あなたの説明と解決策をいただければ幸いです。ありがとう!

編集

それは次のようになるかもしれません:

呼び出しlapack_gesvd_nothrow<float, float>(...)てから typeid 比較を実行するとif (typeid(DType) == typeid(CType))...期待される答えが得られますか? 今のところ、そうは見えません。この比較のためにテンプレートの種類を正しく確認するにはどうすればよいですか?

4

1 に答える 1