шаблоны — функция C ++, которая принимает параметризованный тип, включая подтипы

Библиотека 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 функций, если это возможно.

1

Решение

Основная проблема в объявлении вашей функции заключается в том, что тип аргумента не может быть решен. Это означает, что спецификация класса шаблона не может быть выведена, если вы задаете базовый класс в качестве параметра шаблона.

Аргумент, который вы надеетесь принять, является экземпляром класса шаблона 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);

Оба решения должны помочь вам.

0

Другие решения


По вопросам рекламы [email protected]