我正在尝试获取模板的基本视图,我很困惑。我有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
'时,我已经定义了它已经定义了类型?
答案 0 :(得分:2)
CEvent<CHandle<int>, CSubscriber<cb1> > myevent;
应该是
CEvent<int, cb1> myevent;
答案 1 :(得分: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,因为它可以使将来的维护更容易。
答案 2 :(得分: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);
模板实例化后。