2016-12-04 5 views
0

テンプレートの知識はこの場合少し錆びます。クラスA(2つのテンプレートパラメータ、T1T2とテンプレートクラス)、どのように1が正しく以下f()方法で使用される関数パラメータmyTypeを宣言することができインサイドテンプレートパラメータを使用してテンプレートタイプを作成する

template<typename T1, typename T2> 
class A 
{ 
    void f(T1<T2> myType); 
    void g(T2 myType2) 
} 

編集:使用、 T2はテンプレート化されていないタイプですが、T1はテンプレート化タイプです。

理由はT1を使わずにT2を単独で使用できるユースケースがあるということです。しかし、私はT1に依存して(依存関係をクリアするために)T2を定義したいと思います。

+0

'void f(int myType);'は何をしますか?これは意味がありません。 –

+0

簡単な使用目的を示してください。 –

+0

あなたの混乱は、あなたのうっすらな言葉の使用から来るかもしれません。 「テンプレート型」というものはありません。 *型*があり、*テンプレート*があります。タイプはテンプレートではなく、テンプレートはタイプではありません。型は、テンプレートの(特殊化された)*結果*かもしれませんが、テンプレートをその特殊化と区別することが重要です。 –

答えて

0

T2は、非テンプレートタイプであるが、T1は、この場合、テンプレートタイプ

ある、T1テンプレートテンプレートパラメータであるべきです。詳細についてはhereを参照してください

template<template<typename> class T1, typename T2> 
struct S { 
    void f(T1<T2>) {} 
    void g(T2) {} 
}; 

template<typename> 
struct T {}; 

int main() { 
    S<T, int> s; 
    s.f(T<int>{}); 
    s.g(42); 
} 


それは、最小限、実施例に従います。


しかし、それでもまだ、私はあなたにもで、それを強制することができ、あなたが依存関係を明確にしたい場合は

(明確な依存関係を作るために)T1に応じて、T2を定義したいと思います次の例のような部分的な特殊化を使用します。

template<typename> 
struct S; 

template<template<typename> class T1, typename T2> 
struct S<T1<T2>> { 
    void f(T1<T2>) {} 
    void g(T2) {} 
}; 

template<typename> 
struct T {}; 

int main() { 
    S<T<int>> s; 
    s.f(T<int>{}); 
    s.g(42); 
} 
関連する問題