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

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;代わりに、イベントオブジェクトとして使用したいと思います。クラス内のさまざまなハンドルおよびサブスクライバーの型に typedef を使用すると、CEvent将来の保守が容易になる場合があることに注意してください。

于 2013-07-22T16:16:24.830 に答える