2016-12-04 74 views
0

在這種情況下,我的模板知識有點生疏。使用模板參數創建模板類型

內部A類(2個模板參數,T1T2模板化類),一個如何可以正確地聲明在f()方法下面使用該函數的參數myType

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

編輯:當使用時, T2是非模板類型,但T1是模板類型。

原因是我有T2可以單獨使用,沒有T1的用例。但是,我仍然想根據T1來定義T2(爲了使依賴關係清晰)。

+0

你期望'void f(int myType);'要做什麼?這沒有意義。 –

+0

請顯示一個簡單的預期用例。 –

+0

您的混淆可能來自您對條款草率的使用。沒有像「模板類型」那樣的東西。有*類型*,並有*模板*。類型不是模板,模板也不是類型。類型可能來自模板的(專業化),但區分模板和專業化非常重要。 –

回答

0

T2是一個非模板化的類型,但T1爲模板類型

在這種情況下,T1應該是一個模板的模板參數。
它遵循最小,工作示例:

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); 
} 

進一步詳情,請參閱here


但儘管如此,我想定義在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); 
} 
相關問題