2016-07-20 7 views
3

状況

私は特定のデータ型を保持するコンテナを実装しようとしています - それをCとしましょう。コンテナ(Bと呼ぶ)はAの内部クラスです。テンプレートを宣言しようとしていますコンパイラの問題を抱えていて、何をすべきか分からない。定型テンプレートを含むクラスのテンプレート?

試み

template <typename T<C>> 
class A 
{ 
    class B 
    { 
    typedef std::unique_ptr<T> containerPtr; 
    private: 
     containerPtr container; 
    } 
} 

typedef std::shared_ptr<A<std::vector<C>>> somePtr; // Error! 

エラーがある:

構造体C

タイプ名が


template <typename T,U> 
class A 
{ 
    class B 
    { 
    typedef std::unique_ptr<T<U>> containerPtr; 
    private: 
     containerPtr container; // But does it contain C or some other type now? 
     // We have to do a check - what's the best approach? 
    } 
} 

typedef std::shared_ptr<A<std::vector<C>>> somePtr; 
を許可されていません0

この状況ではどのような方法が最適ですか?

答えて

5

あなたはTは、いくつかのタイプCを保存するテンプレート・コンテナであるという事実を知っているならば、あなたはどこにでもCを指定する必要はありませんし、ちょうどT上でテンプレート化することができます

template <typename T> 
class A { 
    class B { 
     /* Use the type name T however you'd like. */ 
    }; 
}; 

Tが持っているので、これは動作しますあなたは

A<std::vector<int>> 

ような何かを行うならば、Tstd::vector<int>し、任意のトンであるので、完全な形の名前でありますあなたはTを使用します。具体的にはstd::vectorintで、他のタイプのものはありません。

template <template <typename...> class T> 
class A { 
    class B { 
     typedef std::unique_ptr<T<C>> containerPtr; 
     /* ... use containerPtr ... */ 
    }; 
}; 
:あなたは、クライアントがテンプレートクラスの名前を提供して、強制的に Cのお好みでそれをインスタンス化したい場合一方、あなたはこのように、 テンプレートテンプレート引数

を使用することができます

これは、あなたのテンプレートの種類を与えるためにユーザーに要求し、あなたは

A<std::vector> myObject; 

のようなものを書きたいとあなたAテンプレートは、その後をインスタンス化しますタイプCを使用する

+0

ワウ - 追加の編集済みの回答を私に渡す前に、あなたの答えを受け入れたかったのです。あなたは私がしたいことについて私の心を読んでいます。どうもありがとうございました! (私は第二のアプローチをしようとしていましたが、私が最初に解決することを躊躇して決定しました) ''が何をしているのか説明できますか? – OneRaynyDay

+0

@OneRaynyDayここでの一般的なアプローチは、*テンプレートテンプレート引数*と呼ばれ、テンプレートの引数としてテンプレートを提供しています。 'template class T>という表記は、引数が' T'という名前のテンプレートクラスであり、テンプレートクラスが必要とする引数の数には関わりがないことを意味します。 – templatetypedef

+0

ああ、ありがとう!そして、特にテクニックの名前を教えてくれてありがとう - 私は何がGoogleに何を知らないので、主にテンプレートで立ち往生していることがわかります。ほんとうにありがとう。 – OneRaynyDay

関連する問題