2012-04-20 109 views
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; 
} 

我收到一個錯誤,說不能從窗體轉換爲FormData。我帶走了模板,一切工作正常(但我需要的模板)

回答

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); 
} 
+0

雖然對於沒有返回類型或表單數據的時候,只是一個命令,但是這個編譯失敗了,我想這肯定會是: 'code'dispatcher-> dispatch (LOGOUT,0) – rem45acp 2012-04-20 22:55:41

+0

@ rem45acp如果存在使用調度函數但函數的「switch(command)'部分不存在的情況,那麼可能可以將其餘部分拆分爲單獨的_dispatch_專用。 (將更新示例..) – 2012-04-20 23:04:43

1

您可以從Form*(派生類)隱式轉換爲FormData*(基地類),但你不能隱式地從FormData*(基類)轉換爲Form*(派生類)。

一旦你輸入了dispatch函數,編譯器知道你有一個指向基類FormData的指針;它不知道你正在傳遞一個指向派生類的指針,Form