13

STL コンテナーをテンプレート パラメーターとして渡そうとしています。この場合はベクトルです。

ここに私の機能しないコードがあります:

template<template<class> class TContainer, class TObject>
class Foobar
{
public:

    explicit Foobar( TContainer<TObject*> & container )
    :
    container_( container ){}


private:

    TContainer<TObject*> & container_;
};


int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<IUnknown*> v;

    Foobar<std::vector, IUnknown*> bla( v );

    return 0;
}

これは、コンパイラがこれを飲み込むことができないため、私がやろうとしていることはまったく可能ですか?

4

5 に答える 5

10

もう 1 つの可能性はTContainer、可変個引数テンプレートを作成することです。

#include <vector>

struct TObject {};
struct IUnknown {};

template<template<class...> class TContainer, class TObject>
class Foobar
{
public:
    explicit Foobar( TContainer<TObject*> & container ) : container_( container ){}
private:
    TContainer<TObject*> & container_;
};

int main() {
    std::vector<IUnknown*> v;
    Foobar<std::vector, IUnknown> bla( v );
    return 0;
}
于 2013-09-04T12:48:21.867 に答える
9

テンプレート引数には、値、型、およびテンプレートの 3 種類があります。

template <int value_argument> class C { };
template <class type_argument> class D { };
template <template<classT> class template_argument> class E { };

これらのテンプレートを使用するときは、正しい種類の引数を提供する必要があります:

C<3> c;
D<int> d;
E<C> e;

3 番目の形式であるテンプレート テンプレート引数を使用する場合、引数として渡されるテンプレートは、テンプレート テンプレート引数の宣言と一致する必要があります。私の単純な例では、テンプレートEは 1 つの型引数を取るテンプレート テンプレート引数を想定しています。

問題のコードでは、 の宣言の最初の引数Foobarは ですtemplate <class> class TContainer。使用される時点で、渡されるテンプレートは次のstd::vectorとおりです。

Foobar<std::vector, IUnknown*> bla(v);

問題は、テンプレートのテンプレート引数が 1 つの引数を持つべきだと言っているのに、実際の引数として渡されたテンプレートには 2 つ以上の引数があることです。正式にstd::vectorは、

template <class T, class Allocator = std::allocator<T>> class vector { ... };

std::vector> as the first argument toFoobarを使用するに, the definition ofは、最初の引数が 2 つの型引数を取るように Foobar` を変更する必要があります。

template <template<class, class> TContainer, class TObject> class Foobar { ... };
于 2013-09-04T12:47:24.593 に答える
0

まず、おそらくいくつかのコンパイラ エラーが発生する可能性があります。その場合は、現時点では推測しかできないため、それらを質問に追加する必要があります。

第二に、それはあなたのテンプレートパラメータが原因だと思います:

Foobar<std::vector, IUnknown*> bla( v );
//                  ^^^^^^^^^

ここでは、テンプレート パラメーターがポインターであることをコンパイラーに伝えますが、コンストラクターがあります。

Foobar( TContainer<TObject*> & container )
//                 ^^^^^^^^

コンストラクターではwithメンバーであると宣言containerしますが、既に はポインターであるため、現在はポインター ツー ポインターを持っています。等しい場合は等しい。メンバー変数を宣言するときにも同じ問題があります。TContainerTObject*TObjectTObjectIUnknown*TObject*IUnknown**container_

宣言するときは、ポインター型を削除することをお勧めしますbla

Foobar<std::vector, IUnknown> bla( v );
//                  ^^^^^^^^
于 2013-09-04T12:29:29.320 に答える
0

コーディングを簡素化するために、typedef を使用してベクター型のシノニムを作成できます。

typedef vector<MyClass> List;

次に、List をテンプレート パラメーターとして "通常の" 型として使用します。

template<class T, class K>
class Foobar {...}

Foobar<List> variable;
于 2013-09-04T12:29:39.323 に答える