模板函数参数继承

时间:2012-04-20 22:26:56

标签: c++ templates inheritance

我有一个可以返回任何类型,接受命令和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。我带走了模板,一切正常(但我需要模板)

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

您可以隐式地从Form*(派生类)转换为FormData*(基类),但不能FormData*隐式转换(基类)到Form*(派生类)。

一旦输入dispatch函数,编译器就会知道你有一个指向基类FormData的指针;它不知道您正在传递指向派生类Form的指针。