3

任意のタイプを返すことができ、コマンドを受け取り、FormDataオブジェクトを受け取るディスパッチャーがあります。アイデアは、特定のものを渡すときにFormDataから継承したいということです。

struct FormData {};

struct Form : FormData {};

void login(const Form *f){}

enum Command
{
    LOGIN
};

template <typename T>
T dispatch(const Command command, const FormData *f)
{
    switch (command)
    {
    case LOGIN: login(f);
    }

    return T();
}

int main()
{
    Form f;

    dispatch<void>(LOGIN, &f);

    return 0;
}

FormからFormDataに変換できないというエラーが表示されます。テンプレートを削除します。すべて正常に機能します(ただし、テンプレートが必要です)

4

2 に答える 2

2

あなたのFormDataクラスは基本クラスでFormあり、派生していますが、ログイン関数は次のようになります。

void login(const Form *f){}

しかし、ディスパッチ関数では、基本クラスのポインターを渡そうとしています

T dispatch(const Command command, const FormData *f)
{
    switch (command)
    {
    case LOGIN: login(f);
    }

C++ではそれができません。Form*は暗黙的にFormData*に変換できますが、その逆はできません。

おそらく、ディスパッチ関数に別のテンプレートパラメータを追加し、その関数にコンパイル時に具体的な型を認識させることができます。

struct FormData {};

struct Form : public FormData {};

void login(const Form *f){}

enum Command
{
    LOGIN
};    

template <typename T>
T dispatch(const Command command)
{
    return T();
}

template <typename T, typename FormDataType>
T dispatch(const Command command, const FormDataType *f)
{
    switch (command)
    {
    case LOGIN: login(f);
    }

    return dispatch(command);
}

int main()
{
    Form f;

    dispatch<void>(LOGIN, &f);
    dispatch<void>(LOGIN);
}
于 2012-04-20T22:32:15.010 に答える
1

Form*(派生クラス)からFormData*(基本クラス)に暗黙的に変換できますが、 (基本クラス)から(派生クラス)に暗黙的に変換することはできませんFormData*Form*

関数に入るdispatchと、コンパイラは基本クラスへのポインタがあることを認識しますFormData。派生クラスへのポインタを渡していることを認識していませんForm

于 2012-04-20T22:33:14.083 に答える