0

我正在尝试获取模板的基本视图,但我很困惑。我有 3 个类,每个类都基于模板:

#include <map>

using namespace std;

typedef void (*cb1)(int a, int b);
typedef void (*cb2)(int a, int b, int c);

template <class H>
class CHandle{
    H m_id;
};

template <typename H>
class HndFactory {
public:
    CHandle<H>* createHandle() {
        return new CHandle<H>();
    }
};

template <typename H>
CHandle<H> *createHandle(){
    CHandle<H> *h = new CHandle<H>();
    h->m_id = 100;
    return h;
}

template <class S>
class CSubscriber{
    S m_proc;
};

template <class H, class S>
class CEvent{
    H m_handle;
    S m_subscriber;
    std::map<CHandle<H>, CSubscriber<S> > m_map;
public:
    void subscribe(CHandle<H> *h);
    void unsubscribe(CHandle<H> *h);
};
template <class H, class S>
void CEvent<H, S>::subscribe(CHandle<H> *h){

}
int main(void){
    HndFactory<int> f;
    CSubscriber<cb1> s;
    CHandle<int> *h = f.createHandle();
    CEvent<CHandle<int>, CSubscriber<cb1> > myevent;
    myevent.subscribe(h);
    return 0;
}

当我试图运行方法“ myevent.subscribe”时,我得到了这个编译器错误:

CGlue.cpp: In function âint main()â:
CGlue.cpp:64: error: no matching function for call to âCEvent<CHandle<int>, CSubscriber<void (*)(int, int)> >::subscribe(CHandle<int>*&)â
CGlue.cpp:54: note: candidates are: void CEvent<H, S>::subscribe(CHandle<H>*) [with H = CHandle<int>, S = CSubscriber<void (*)(int, int)>]

我该如何以正确的方式调用此方法?我认为当我创建对象时h它已经定义了类型?

最好的问候J。

4

3 回答 3

2
CEvent<CHandle<int>, CSubscriber<cb1> > myevent;

应该

CEvent<int, cb1> myevent;
于 2013-07-22T16:11:56.673 回答
0

该错误消息实际上会告诉您这里有什么问题,只需深入了解其细节:

candidates are: void CEvent<H, S>::subscribe(CHandle<H>*) [with H = CHandle<int>

从这里我们看到候选方法被列出,模板类型和推导的类型H。当您将 H 替换为相关类型时,您将获得以下候选:

void CEvent<H, S>::subscribe(CHandle<CHandle<int> >*)CHandle<int>现在希望显然与传入的不匹配。

相反,我认为您想CEvent<int, cb1> myevent;用作事件对象。请注意,您可能希望对CEvent类中的各种句柄和订阅者类型使用 typedef,因为它可以使将来的维护更容易。

于 2013-07-22T16:16:24.830 回答
0

您要么需要将班级成员更改为

std::map<H, S> m_map;

void subscribe(H *h);
void unsubscribe(CHandle<H> *h); 

或者

您的CEvent对象应声明为

CEvent<int, cb1> myevent;

您必须进行这两项更改之一。

您当前的代码两次执行模板操作。和

template <class H, class S>
class CEvent{

CEvent<CHandle<int>, CSubscriber<cb1> > myevent;

你所拥有的是

H == CHandle<int> & S = CSubscribe<cb1>

所以

void subscribe(CHandle<H> *h);

变成

void subscribe(<CHandle<CHandle<H> > * h);

一旦模板被实例化。

于 2013-07-22T16:17:36.300 回答