Библиотека 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 функций, если это возможно.
Основная проблема в объявлении вашей функции заключается в том, что тип аргумента не может быть решен. Это означает, что спецификация класса шаблона не может быть выведена, если вы задаете базовый класс в качестве параметра шаблона.
Аргумент, который вы надеетесь принять, является экземпляром класса шаблона 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);
Оба решения должны помочь вам.