2012-03-21 17 views
1

古いコードでは、あまり書かれていないコードに新しい機能を追加する必要があります。画面に表示され処理される必要のある50種類のリストがあり、それらの現在のコードは、DAOデータベース内のリストとマップ内の他の2種類の小さな変更を含むすべてのカットアンドペーストです。C++の関数に異なる値型のマップを渡す

私は、機能を提供するSearchクラスと、Searchによって必要とされる基本機能を提供するための各リストタイプのヘルパークラスを作成しました。マップヘルパークラスは、tstring Keyへのアクセスのみを必要とし、異なるObject Valuesは必要ありません。しかし、私はこれをコンパイルすることはできません。

さまざまなdifferentObjectは関係がないので、私は基本的に空のSearchValueクラスを定義し、それをすべてのdifferentObjectクラスのスーパークラスとして.hに追加しました。例として

は、ここにマップする定義のいずれかである:

class MyPatListEntry : public SearchValue { 

およびIとしての機能を定義した:

typedef map<tstring, MyPatListEntry *, tstringcomp> patlist; 

MyPatListEntryが定義され

ListHelper(map<tstring, SearchValue *> *map, CString fieldName) 

コンパイラ(VC++)は、ListHelper()の定義がすべての引数を処理しないというエラーを返します。定義でSearchValueをMyPatListEntryに置き換えると、コンパイルが機能するので、基本形式は正しいです。

私はサイトを見回して、この種のことを機能テンプレートで行うことを提案していましたが、それはうまくいくと思いますが、何らかの理由でこの方法が機能しないのか不思議です。

ありがとうございました。

+0

'MyPatListEntry'がタイプ' SearchValue'ですが、 'map 'はタイプ 'map 'ではありません。 – Dialecticus

答えて

3

共変ジェネリック型パラメータはC#の世界では(C++では不可能です)、あなたの状況では動作しません。理由は実際にはかなり簡単です。あなたはこの問題のためのパラメータとしてmyMapmyFuncを呼び出すことが許可されていません

class B {}; 
class D1 : public B {}; 
class D2 : public B {}; 

map<string, D1 *> myMap; 
D2 someObject; 

void myFunc(map<string, B *> & someMap) 
{ 
    someMap["foo"] = &someObject; 
} 

は、次のコードを想像してみてください。 のタイプD2D1とする予定のマップに割り当てることができます。

+0

これはC#で可能ですか? –

+0

これは良い点です。もしそれが "void myFunc(const map &someMap)"だったら? – russell

+0

@David C#では、いくつかのジェネリック型パラメータを_input_または_output_のみとして制限できます。例えば、MapReader ジェネリックインターフェイスをいくつかの基になるマップの検査のためだけに使うことができます。出力パラメータとしてのみ、MapReader を暗黙的に 'MapReader 'に変換することと引き換えに、MapReaderでこれらの型のパラメータオブジェクトを作成またはコピーまたは受け入れることはできません – Fiktik

0

あなたが本当に違うSearchValue種類以上の異なる動作を持っているListHelperが必要な場合、あなたのマップの値型の上に機能をテンプレートに適切かもしれない:

template <class AnySearchValue> ListHelper(map<tstring, AnySearchValue *> *map, CString fieldName) 

それはそれは見ずに実行可能かどう言うのは難しいですしかし、より多くの実装。あなたがこれを考慮したと言っていたあなたのOPには見逃してしまいました)

関連する問題