2

以下是我的测试代码。我只想知道点是什么类型。但是在“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;
}
4

4 回答 4

4

像这样定义方法就足够了:

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

所以只需去掉<T>后面的instanceOf - 编译器已经知道它是一个模板函数。

于 2013-08-20T08:05:52.360 回答
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>
于 2013-08-20T08:03:09.853 回答
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,参数应该是多态类型。因此,在您的情况下,代码将无法编译。

于 2013-08-20T08:18:47.753 回答
0

你的 instanceOf 函数应该是这样的:

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

您不需要在函数名称之后。

于 2013-08-20T10:07:23.013 回答