2013-02-10 136 views
4

我想訪問類之外的模板參數。我通常這樣做如下:typedefing非類型模板參數

template <class T> 
class A 
{ 
    typedef typename T T; 
} 

A<int>::T; 

我想能夠對非類型的模板參數做同樣的事情。這是行不通的:

template <int T> 
class A 
{ 
    typedef typename T T; 
} 

A<3>::T; 

我會澄清爲什麼我需要這個。我想要定義第二個類如下:

template <class C> 
class B 
{ 
    static int func() {return C::T;} 
} 

B<A<3> >::func(); 

這樣做的正確方法是什麼? 非常感謝。

+1

'class'可以與'typename'互換,'int'不可以。另外,你想達到什麼目的? – antonijn 2013-02-10 15:33:50

+0

其實,你不能在任何一個代碼中使用'typename',因爲'T'不是一個相關的名字,你也不能重新定義'T'。 – 2013-02-10 15:36:05

+0

在未限定名稱之前的'typename',例如從屬非限定名稱'T',是不可能的。 – 2013-02-10 16:38:25

回答

5

這是因爲T不是類型名稱,你不能typedef它。這是一個int值,如果您想以類的靜態成員身份訪問它,則需要靜態成員int。好像你真正想要的是這樣的:

template <int T> 
class A 
{ 
    public: 
    static const int x = T; 
}; 

doSomething(A<5>::x); 
2

這是一個值,而不是一個類型,所以可能:

template <int T> 
class A 
{ 
    static const int param = T; 
}; 

然後你就可以訪問它A<42>::param。並不是說它有很大的幫助,除非A本身被用作其他地方的模板參數。

1

在第二種情況下,T不是一種類型,它是一個int的值。因此,您應將其定義爲const intstatic const int值。

template <int T> 
class A { 
    static const int T = T; 
}; 

請注意,這是習慣使用T的類型(特別是當模板是一元,因爲是在類型沒有歧義),以及其他名稱爲常數,通常是一個更有意義的名稱,例如SIZE或最好是Size(所有大寫符號最適用於宏)。

template <int Param> 
class A { 
    static const int param = Param; 
}; 

參見在模板定義的上下文中使用static const值的其它SO問題(如this one)。