1

OpenFOAM 库定义了两种类型,volMeshsurfaceMesh,它们都继承自GeoMesh<fvMesh>. 我想定义一个接受参数的函数:

void foo(GeometricField<vector, fvsPatchField, GeoMesh<fvMesh> >& field) { ... }

但是,当我尝试调用该函数时,g++ 会给出错误“引用类型的无效初始化”:

// surfaceVectorField is a typedef GeometricField<vector, fvsPatchField, surfaceMesh>
surfaceVectorField Uf( /* initialisation arguments */ ); 
foo(Uf);

来自 Java 背景,这个问题似乎类似于忘记使用声明,例如

void foo(GeometricField<vector, fvsPatchField, ? extends GeoMesh<fvMesh>> field) { ... }

如果可能,我需要避免 C++11 特有的特性。

4

1 回答 1

0

您的函数声明中的基本问题是无法解析参数的类型。这意味着如果您将基类作为模板参数,则无法推断出模板类的规范。

您希望采用的参数是模板类 GeometricField 的一个实例。此外,类模板的名称不是类型。表示函数定义foo(GeometricField& field);是不可能的。

如果您希望该函数接受来自表面和体积网格类型的几何场,您需要将其设为模板函数或重载它。第一个模板:

template <typename T>
void foo(GeometricField<vector, fvsPatchField, T>& field) {}

要不就

template <typename T>
void foo(T& field) {}

哪个更适合您在该功能中所做的事情。另请注意,如果要重用该函数,则需要注意参数不是您期望的情况。

重载:

void foo(surfaceVectorField& field);
void foo(volVectorField& field);

两种解决方案都应该可以帮助您。

于 2014-12-18T12:30:15.250 回答