0

次の C++ コード (Microsoft COM ヘッダー ファイルから) で、 で始まる部分は何template<class Q>...ですか?

structaは使用されていますが、クラスのような要素があるため、他の理由でも完全に混乱しています。たとえば、publicキーワード。

extern "C++" {
    struct IUnknown {
    public:
        virtual HRESULT WINAPI QueryInterface(REFIID riid,void **ppvObject) = 0;
        virtual ULONG WINAPI AddRef(void) = 0;
        virtual ULONG WINAPI Release(void) = 0;
        template<class Q> HRESULT WINAPI QueryInterface(Q **pp) { return QueryInterface(__uuidof(*pp),(void **)pp); }
    };
  }
4

1 に答える 1

1

で始まる部分がtemplate<class Q> HRESULT WINAPI QueryInterfaceテンプレートメンバー関数です。つまり、クラス (またはこの場合は構造体) のメンバーである関数テンプレートです。

テンプレートであることは、任意のインターフェイス型をパラメーターとして渡すことができることを意味し、コンパイラーはその型のインターフェイスのオブジェクトを照会する関数を生成します。

IFoo *x;
IBar *y;

if (foo.QueryInterface(&x) != S_OK) {
    // use x->whatever to invoke members of IFoo
}

if (foo.QueryInterface(&y) != S_OK) {
    // use y->whatever to invoke members of IBar
}

これは関数テンプレートであるため、コンパイラはQ渡されたパラメーターの型から型を推測します。IFoo **QIFooIBar **QIBar

classC++ では、 aとの唯一の違いは、 a のstructメンバーの可視性がclassデフォルトで に設定されていることprivateですが、 a ではstructデフォルトで設定されていpublicます (したがって、public:この場合、タグは何も実行しません)。

于 2015-05-05T13:57:20.513 に答える