2013-08-20 37 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

我希望例如'類A'只是一個佔位符而不是真正的代碼? –

+1

在附註中,爲什麼使用: 'if(NULL == tmp) return 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 {}; 

?請注意0​​只適用於多態類。

而且,除非你專門爲一個類型的模板方法,正確的語法是:

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

thx,這個定義就是假代碼。和destrcution方法是虛擬的,使他們是多態類。 – user2539662

+0

我以這種方式更正了代碼後,它運行良好。謝謝 – user2539662

4

這足以做到這樣定義方法:

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

所以只要去掉<T>instanceOf - 編譯器已經知道它是一個模板化函數。

0

你的目的,這是不是可以簡單

#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

你}這種功能應該是這樣的:

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

你不需要後函數名。

相關問題