成员函数的无效使用(你忘记了“()”吗?)
Posted
技术标签:
【中文标题】成员函数的无效使用(你忘记了“()”吗?)【英文标题】:Invalid use of member function (did you forget the ‘()’ ?) 【发布时间】:2020-08-02 02:28:19 【问题描述】:我遇到了这个错误,我无法完全理解为什么会发生。我正在尝试在基类中使用模板函数:
在 .h 文件中
class CylindricalWave
public:
virtual ~CylindricalWave()
virtual double intensity(double r, double z, double t) = 0;
virtual std::complex<double> efield(double r, double z, double t) = 0;
template<int Nr, int Nz>
Eigen::Matrix<std::complex<double>, Nz, Nr> efield(Eigen::Matrix<double, Nz, Nr>& rs, Eigen::Matrix<double, Nz, Nr>& zs, double t);
template<int Nr, int Nz>
Eigen::Matrix<std::complex<double>, Nz, Nr> intensity(Eigen::Matrix<double, Nz, Nr>& rs, Eigen::Matrix<double, Nz, Nr>& zs, double t);
;
我也在 .h 文件中定义了我的模板方法:
template<int Nr, int Nz>
Eigen::Matrix<std::complex<double>, Nz, Nr> CylindricalWave::efield(Eigen::Matrix<double, Nz, Nr>& rs, Eigen::Matrix<double, Nz, Nr>& zs, double t)
Eigen::Matrix<std::complex<double>, Nz, Nr> output;
for (size_t i = 0, size = rs.size(); i < size; i++)
double temporary_r = (*(rs.data() + i));
double temporary_z = (*(zs.data() + i));
*(output.data()+i) = this->efield(temporary_r, temporary_z, t); //here I call the virtual efield of Cylindrical Wave. I thought the compiler would understand that it has to call the child method that accepts doubles.
return output;
现在我有一个名为 GaussianBeam
的子类,我在其中覆盖了 efield 方法:
class GaussianBeam : public CylindricalWave
public:
virtual std::complex<double> efield(double r, double z, double t); //this is the define this virtual method.
virtual double intensity(double r, double z, double t); //I also define this one.
;
现在定义了 efield(接受 double r, double z, double t
的版本),我希望我的 efield 模板版本允许我调用:
GaussianBeam gauss = GaussianBeam();
const int Nx = 3;
const int Ny = 2;
//creates the "meshgrid"
Eigen::Matrix<double, Ny, Nx> X = Eigen::RowVectorXd::LinSpaced(Nx, -5e-4,5e-4).replicate(Ny,1);
Eigen::Matrix<double, Ny, Nx> Y = Eigen::VectorXd::LinSpaced(Ny, -5e-3, 5e-3).replicate(1, Nx);
//calculates the field:
//I would have expected the code to call the parent version of efield since it's the only that matched the signature of the arguments. Yet, I feel like it's trying to call the one that uses doubles that was defined in the class GaussianBeam.
gauss.efield<Nx, Ny>(X, Y, 0);
但最后一行只是说Invalid use of member function (did you forget the ‘()’ ?)
,我不太明白,因为我认为 GaussianBeam 会继承 efield 的模板版本,我可以从 GaussianBeam 的实例中调用它。
为什么会这样?我对继承有什么误解?谢谢。
【问题讨论】:
gauss
是什么?此名称从未在所示代码中声明。
抱歉,我的问题打错了。现在已修复。 gauss
是 GaussianBeam 的一个实例。
【参考方案1】:
在GaussianBeam
的某处添加这一行:
using CylindricalWave::efield;
否则,GaussianBeam
中的 efield
成员将隐藏基类中名为 efield
的所有成员。由于GaussianBeam::efield
不是模板,因此编译器假定gauss.efield<Nx, Ny>(X, Y, 0)
中的尖括号是小于运算符。
【讨论】:
以上是关于成员函数的无效使用(你忘记了“()”吗?)的主要内容,如果未能解决你的问题,请参考以下文章
glReadPixels 成员的无效使用(你忘记了 '&' 吗?)
使用嵌套类函数时非静态数据成员的使用无效,但函数未嵌套时可以吗?