我正在尝试用C ++编写一些代码(对于OpenFOAM),但我得到了这段代码标题中给出的错误:
// Copy set
void backup
(
const polyMesh& mesh,
const word& fromName,
const topoSet& fromSet,
const word& toName
)
{
Info<< "Backing up " << fromName << " into " << toName << endl;
topoSet backupSet(mesh, toName, fromSet);
backupSet.write();
}
完整错误是:
faceSet.C:51:18: error: cannot declare variable ‘backupSet’ to be of abstract type ‘Foam::topoSet’
错误在这一行:
topoSet backupSet(mesh, toName, fromSet);
从这个看起来,我想我明白topoSet可能应该被声明为常数,但我尝试了这个并没有任何区别。
我有一些类似性质的错误,但我只是想了解如何解决这个问题。
答案 0 :(得分:2)
您无法创建topoSet
实例,因为它是一个包含虚拟未实现方法的抽象类(maxSize()
似乎是其中之一)。即使没有未实现的(纯虚拟)成员,创建topoSet
实例也是错误的,因为您将丢失有关原始类型fromSet
的所有信息及其拥有的所有数据在topoSet
以上(这类似于slicing)。
我认为您应该使用topoSet::New()
静态函数之一(命名构造函数),或者如果您只需要将其保存为其他名称,那么只需使用topoSet::rename()
(实际上) regIOobject::rename()
)。
答案 1 :(得分:0)
您无法使用topoSet backupSet;
,因为这会尝试实例化topoSet
,而您无法做到这一点。
您需要创建具体派生类的实例。您需要找到合适的东西或自己创建。如果我们假设这样的事情被称为foo
,那么你可以使用指针
topoSet* backupSet = new foo(/*ToDo - parameters*/)
或实例化目录foo backupSet(/*ToDo - parameters, omit the parentheses if there are no parameters*/)
。