1

OpenFOAM ライブラリは と の 2 つの型を定義して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 固有の機能を避ける必要があります。

4

1 に答える 1

0

関数宣言の基本的な問題は、引数の型を解決できないことです。つまり、基本クラスをテンプレート パラメーターとして指定した場合、テンプレート クラスの仕様を推測することはできません。

取りたい引数は、テンプレート クラス GeometryField のインスタンスです。さらに、クラス テンプレートの名前は型ではありません。関数定義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);

どちらのソリューションでも、そこにたどり着くはずです。

于 2014-12-18T12:30:15.250 に答える