gpt4 book ai didi

接受参数化类型(包括子类型)的 C++ 函数

转载 作者:太空宇宙 更新时间:2023-11-04 13:44:38 24 4
gpt4 key购买 nike

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

最佳答案

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

您希望接受的参数是模板类 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);

这两种解决方案都可以帮助您实现目标。

关于接受参数化类型(包括子类型)的 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26490163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com