在'<'标记之前的预期初始化程序

时间:2013-08-20 08:01:08

标签: c++ templates

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

4 个答案:

答案 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;
}

你不需要在功能名称之后。