OpenFOAM库定义了两种类型volMesh
和surfaceMesh
,它们都继承自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的功能。
答案 0 :(得分: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);
两种解决方案都可以帮到你。