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

Form에서 FormData로 변환 할 수 없다는 오류가 발생합니다. 내가 템플릿을 빼앗아, 모든 것이 잘 작동 (하지만 템플릿이 필요) 귀하의 FormData 클래스는 기본 클래스, Form 파생되는

답변

2

을, 그러나 당신의 로그인 기능이 보이는

void login(const Form *f){} 

그러나에

처럼 디스패치 함수를 호출하면 기본 클래스 포인터를 전달하려고합니다.

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

C++은 단순히 그렇게 할 수 없습니다. 양식 *은 암시 적으로 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

+0

@ rem45acp 디스패치 기능을 사용하지만 기능의 'switch (command)'부분이 아닌 경우, 나머지 부분을 _dispatch_의 별도 특수화로 나눌 수 있습니다. (예를 업데이 트합니다 ..) –

1
당신은 FormData*Form* (파생 클래스)에서 암시 적으로 변환 할 수 있습니다

(베이스 클래스),하지만 FormData* (기본 클래스)에서 암시 적으로 Form* (파생 클래스)로 변환 할 수 없습니다.

dispatch 함수를 입력하면 컴파일러에서 기본 클래스 FormData에 대한 포인터를 가지고 있음을 알게됩니다. 파생 클래스 인 Form에 대한 포인터를 전달하고 있다는 것을 알 수 없습니다.