2013-08-20 2 views
1

다음은 테스트 코드입니다. 나는 단지 어떤 유형의 요점인지 알고 싶다. 그러나 "bool instanceOf (A * msg)"줄에서 컴파일하는 동안 오류가 발생했다. 그것을 고치는 법. 고마워.'<'토큰 앞에 예상 된 이니셜 라이저

#include <iostream> 

using namespace std; 

class A 
class B : public A 
class C : public A 
template <class T> 
bool instanceOf<T>(A* msg) 
{ 
    T *tmp = dynamic_cast<T *>(msg); 
    if(NULL == tmp) 
     return false; 
    return true; 
} 
void resolveMsgType(A* msg) 
{  
    if(instanceOf<B>(msg)) 
    { 
     cout<<"this is class B"<<endl; 
    }else if(instanceOf<C>(msg)){ 
     cout<<"this is class C"<<endl; 
    }else{ 
     cout<<"error"<<endl; 
    }  
} 

int main() 
{ 
    A *a; 
    a = new B(); 
    resolveMsgType(a); 
    a = new C(); 
    resolveMsgType(a); 
    return 0; 
} 
+0

'class A'는 실제 코드가 아니라 단지 자리 표시 자일뿐입니다. –

+1

사이드 노트에 왜 사용 : 'if (NULL == tmp) false를 반환; return true; 쓸 수있는 경우 'return tmp! = NULL; ' – Dariusz

답변

3
class A 
class B : public A 
class C : public A 

은 유효 C++하지 않습니다 당신은

class A {}; 
class B : public A {}; 
class C : public A {}; 

을 찾으시는 것입니까?

또한 dynamic_cast은 다형성 클래스에서만 작동합니다. 당신이 유형에 대한 템플릿 방법을 전문으로하지 않는 한

또한, 올바른 구문은 다음과 같습니다 그래서 그냥 제거

template <class T> 
bool instanceOf(A* msg) { ... } 

:

template <class T> 
bool instanceOf(A* msg) 
//   ^
//  note no <T> 
+0

thx, 정의는 단지 가짜 코드입니다. destrcution 메소드는 polymorphic 클래스가되도록 virtual입니다. – user2539662

+0

내가이 방법으로 코드를 수정 한 후에 제대로 작동합니다. 고마워 – user2539662

4

이 같은 방법을 정의 충분히 할 것 이후 instanceOf - 컴파일러는 이미 템플릿 기능임을 알고 있습니다.

#include<iostream> 
using namespace std; 
class A 
{ 
public: 
    virtual void resolveMsgType(){}; 
}; 
class B : public A 
{ 
public: 
    void resolveMsgType() 
    { 
     cout<<"this is class b"; 
    } 
}; 
class C : public A 
{ 
public: 
    void resolveMsgType() 
    { 
     cout<<"this is class c"; 
    } 
} ; 
int main() 
{ 
    A *a = new B(); 
    a->resolveMsgType(); 
    a = new C(); 
    a->resolveMsgType(); 
    cin.ignore(); 
} 

는 또한 dynamic_cast를 사용하도록 목적

0

이 간단하지 않을 것이다, 매개 변수는 다형성 유형을 사용해야합니다. 따라서 귀하의 경우에는 코드가 컴파일되지 않습니다.

0

귀하의 instanceof를 기능은 다음과 같이해야합니다 :

template <class T> 
bool instanceOf(A* msg) 
{ 
    T *tmp = dynamic_cast<T *>(msg); 
    return tmp != NULL; 
} 

당신은 함수 이름 뒤에 필요 없어요.

관련 문제