2017-12-12 12 views
2

「テンプレートのテンプレート」のコンセプトで少し混乱します。たとえば、これはコンパイルできますテンプレートクラスのテンプレートをインスタンス化する方法

template<typename X1> 
class T1 {}; 

template<class X2, template<typename X> class T > 
class TT {}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    TT<int, T1> tt1; //compile ok 
    //TT<int, T1<int>> tt2; //compile error 
    return 0; 
} 

私はtt1定義はtypeパラメータX2ためintを供給している、ことをここで混乱している、とテンプレート型パラメータTためT1、これらは、それ自体が必要とするすべての罰金です...しかしT1タイプX1、これがなくても、C++コンパイラはどのようにコンパイルできますか?

+0

'template class T' - ここで' X 'は赤いニシンです。 – StoryTeller

+0

@StoryTeller私は分かりません - 'T'はそれを指定するために型パラメータ' X'を必要とするテンプレートです、そうではありませんか? – athos

+0

それは1つの議論を受け入れる。しかしそこには「X」は全く使われていません。 – StoryTeller

答えて

2

クラステンプレートとクラステンプレートインスタンシエーションを区別する必要があります。インスタンシエーションは実際のタイプですが、テンプレート自体はタイプではありません。タイプはではありません。

パラメータTは、大まかに言えばタイプのファミリであるテンプレートであると考えられています。 tt1の場合は、T1の形式で指定します。

しかし、失敗した試行では、テンプレートを指定せずに、(T1をインスタンス化して)型を指定します。 T1<int>はテンプレートではなく、いくつかのクラスです。

私はあなたがTX)のパラメータを指定したという事実をあなたに伝えてくれると思います。あなたが提供する名前は、TTの宣言にとって重要なものではありません。テンプレートとその引数ではなく、2番目のパラメータとしてテンプレートが必要です。実際には、TTについてはXは参照できません。試してみると、コンパイラはXが何であるか分からないと不平を言うでしょう。

+1

今私はそれを得た。どうも! – athos

関連する問題