2014-10-21 2 views
1

Библиотека OpenFOAM определяет два типа: volMesh и surfaceMesh, оба из которых наследуют от GeoMesh<fvMesh>. Я хочу, чтобы определить функцию, которая принимает аргумент:Функция C++, которая принимает параметризованный тип, включая подтипы

void foo(GeometricField<vector, fvsPatchField, GeoMesh<fvMesh> >& field) { ... } 

Однако г ++ выдает ошибку «неверный инициализации ссылочного типа» когда я пытаюсь вызвать функцию:

// 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

Вы можете добавить немного больше кода, а именно пример того, как вы пытаетесь назвать свою функцию? – Ashalynd

+1

- это ошибка от вызова функции на 'foo()' или определение переменной 'Uf'? http://stackoverflow.com/questions/9285627/is-it-possible-to-pass-derived-classes-by-reference-to-a-function-taking-base-cl –

+0

Возможно, он не может преобразовать ваш параметр surfaceMesh в 'GeoMesh ', или вся конструкция ссылается на правильный сложный тип. – Ashalynd

ответ

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

Оба решения должны получить Вас там.

Смежные вопросы