error: cannot allocate an object of abstract type

error: cannot allocate an object of abstract type

虽然我很想为这个问题创建一个 MVCE...但我真的做不到。我正在使用一个名为 Palabos 的开源流体流动求解器,它的开发指南也可用。它基于通用结构和 mpi。可能是同类中最好的开源求解器

那里的开发人员使用 Box Processors 循环遍历数组(一般来说..它可以是张量,格子是其他对象)。这是他们将处理器用于单个格子案例的一种方式

struct IniTemperatureRayleighBenardProcessor2D :
    public BoxProcessingFunctional2D_L<T,adDescriptor>
{
    IniTemperatureRayleighBenardProcessor2D(RayleighBenardFlowParam<T,nsDescriptor,adDescriptor> parameters_)
        : parameters(parameters_)
    { }
    virtual void process(Box2D domain, BlockLattice2D<T,adDescriptor>& adLattice)
    {
        Dot2D absoluteOffset = adLattice.getLocation();
        Array<T,adDescriptor<T>::d> jEq(0.0, 0.0);

    for (plint iX=domain.x0; iX<=domain.x1; ++iX) {
        for (plint iY=domain.y0; iY<=domain.y1; ++iY) {
//some operations...............
        }
    }
    }
    virtual IniTemperatureRayleighBenardProcessor2D<T,nsDescriptor,adDescriptor>* clone() const
    {
        return new IniTemperatureRayleighBenardProcessor2D<T,nsDescriptor,adDescriptor>(*this);
}

virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
    modified[0] = modif::staticVariables;
}

virtual BlockDomain::DomainT appliesTo() const {
    return BlockDomain::bulkAndEnvelope;
}

private :
    RayleighBenardFlowParam<T,nsDescriptor,adDescriptor> parameters;
};

这是他们的称呼

   applyProcessingFunctional (
            new IniTemperatureRayleighBenardProcessor2D<T,NSDESCRIPTOR,ADESCRIPTOR>(parameters), adLattice.getBoundingBox(),
            adLattice );

整个过程的详细信息在 (http://www.palabos.org/documentation/userguide/data-processors.html)

相关源代码位于 (http://www.palabos.org/documentation/develguide/dataProcessingFunctional2D_8h_source.html)

现在,这是我的问题。 我正在使用类似的数据处理器对两个标量数组执行操作。试图尽可能多地了解源代码

template<typename T1, typename T2>
//template<typename T, template<typename NSU> class nsDescriptor,
//                     template<typename ADU> class adDescriptor, typename T1, typename T2>
struct IniFluxMultiplier2D :
    public BoxProcessingFunctional2D_SS<T,T>
{
    IniFluxMultiplier2D(RayleighBenardFlowParam<T,NSDESCRIPTOR,ADESCRIPTOR> parameters_)
        : parameters(parameters_)
    { }
    virtual void process(Box2D domain,
                         MultiScalarField2D<bool>& boolMask,
                         MultiScalarField2D<T> &FluxMultiplier)
        {
        //Dot2D absoluteOffset = adLattice.getLocation();
        //Array<T,adDescriptor<T>::d> jEq(0.0, 0.0);

        for (plint iX=domain.x0; iX<=domain.x1; ++iX) {
            for (plint iY=domain.y0; iY<=domain.y1; ++iY) {
                //plint absoluteX = absoluteOffset.x + iX;
                //plint absoluteY = absoluteOffset.y + iY;
                bool  solidblock = boolMask.get(iX,iY);

                if(solidblock== true){
                FluxMultiplier.get(iX,iY)=(parameters.getTemperatureTau()-(T)0.5)/parameters.getTemperatureTau();}
                else{
                FluxMultiplier.get(iX,iY)=(parameters.getSolventTau()-(T)0.5)/parameters.getSolventTau();}

        }
    }
    }
   virtual IniFluxMultiplier2D<T1,T2>* clone() const
    {
        return new IniFluxMultiplier2D<T1,T2>(*this);
    }

   virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const {
        modified[0] = modif::staticVariables;
    }

    virtual BlockDomain::DomainT appliesTo() const {
        return BlockDomain::bulkAndEnvelope;
    }

private :
    RayleighBenardFlowParam<T,NSDESCRIPTOR,ADESCRIPTOR> parameters;
};

我是这样称呼它的

applyProcessingFunctional (
        new IniFluxMultiplier2D<T,T>(parameters), boolMask.getBoundingBox(), boolMask,FluxMultiplier);

我遇到错误

error: cannot allocate an object of abstract type ‘IniFluxMultiplier2D<double, double>’|

尝试调试它,但我卡住了,真的想不出出路。我真的不希望任何人 运行 这个,但我知道我在结构的开头犯了一个概念错误,我无法真正弄清楚。

T 被声明为

typedef double T;

全球

process()的签名是

virtual void process (Box2D domain, ScalarField2D< T1 > &field1, ScalarField2D< T2 > &field2)=0

但是您传递的是 MultiScalarField2D<T>&,并且似乎没有可用的转换为 ScalareField2d<T>&。所以你已经定义了一个新的虚函数并且没有覆盖基础中的函数。在这些情况下使用 override 关键字会有所帮助。