错误: 无法分配抽象类型的对象

error: cannot allocate an object of abstract type

本文关键字:抽象类 类型 对象 抽象 分配 错误      更新时间:2023-10-16

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

那里的开发人员使用 Box 处理器在数组中循环(一般来说......它可以是张量,格是其他对象)。这是他们将处理器用于单个晶格外壳的一种方法

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 关键字会有所帮助。