成员函数的无效使用(你忘记了“()”吗?)

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&lt;Nx, Ny&gt;(X, Y, 0) 中的尖括号是小于运算符。

【讨论】:

以上是关于成员函数的无效使用(你忘记了“()”吗?)的主要内容,如果未能解决你的问题,请参考以下文章

glReadPixels 成员的无效使用(你忘记了 '&' 吗?)

使用嵌套类函数时非静态数据成员的使用无效,但函数未嵌套时可以吗?

成员的无效使用(您是不是忘记了«&»?)

Linux - 信号:错误:非静态成员函数的使用无效

Qt中的QSettings这个类有.value这个成员函数吗?

类成员函数可以为回调函数吗