以下是我的测试代码。我只是想知道这个点是什么类型。但是在“bool instanceOf(A * msg)”行编译时遇到错误。如何纠正它。 THX。
#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 :(得分:4)
这样定义方法就足够了:
template <class T>
bool instanceOf(A* msg) { ... }
所以只需在 instanceOf 之后删除<T>
- 编译器已经知道它是模板化函数。
答案 1 :(得分: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>
答案 2 :(得分: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
,参数应为多态类型。所以在你的情况下,代码将无法编译。
答案 3 :(得分:0)
你的instanceOf函数应该是这样的:
template <class T>
bool instanceOf(A* msg)
{
T *tmp = dynamic_cast<T *>(msg);
return tmp != NULL;
}
你不需要在功能名称之后。