接受包含子类型的参数化类型的C ++函数

时间:2014-10-21 15:13:36

标签: c++ templates openfoam

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的功能。

1 个答案:

答案 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);

两种解决方案都可以帮到你。