【发布时间】:2013-08-03 05:48:38
【问题描述】:
我不确定我是否理解这里发生的事情的细微差别,并希望得到解释。
我正在从模板化包装器lapack_gesvd_nothrow 中调用几个重载函数。从那里,我打电话给像这样的个人 fxns:
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);
}
在我声明第二种类型的重载(我用 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_casts。
这是它显然在寻找的 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))... 我会得到预期的答案吗?现在看来,并非如此。如何正确检查模板类型以进行此比较?
【问题讨论】:
-
函数正在等待 nm::Complex64* 但您正在传递 float*
-
看第一个函数定义。那就是... 1) 接受 14 个参数 2) 接受所有
float*而不是任何nm::Complex64* -
我假设你想调用第二个函数,因为你传递了 15 个参数。 (注:候选人期望 14 个参数,提供 15 个)
-
好点...我想你可能已经明白了。我现在怀疑这是我对
DType和CType的比较。如果我用所有浮点数调用 15 参数版本,那就错了。完美。 -
这表明我的比较应该有效...java2s.com/Tutorial/Cpp/0100__Development/…
标签: c++ templates overloading typeid