2013-08-20 6 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) 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 {}; 

?

Также обратите внимание, что dynamic_cast работает только с полиморфными классами.

Кроме того, если вы не Специализируя метод шаблон для типа, правильный синтаксис:

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

thx, определение - всего лишь поддельный код. и методы деструкции являются виртуальными, чтобы сделать их полиморфными классами. – 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

Ваша функция InstanceOf должна быть такой:

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

вам не нужно после имени функции.

Смежные вопросы