2010-11-27 147 views
1

我爲什麼能做到這一點並不:不要訪問模板模板參數

template<template<class E>class Derived> 
struct X 
{ 
    static void f() 
    { 
     Derived<E>::value; 
    } 
}; 

,我有是,我不能編譯爲我收到一個錯誤說的原因,這個代碼的問題該參數E尚未宣佈。有沒有辦法可以使用這個正式參數?

回答

3

模板模板參數的參數不會獲取參數,因此通常不會有名稱。部分專業化是這個規則的例外。試試這個:

template<class> // Derived<E> is only only parameter 
struct X; // but you actually need two parameters, Derived and E 

template< template <class> class Derived, class E > 
struct X< Derived<E> > // so use partial specialization. 
{ 
    static void f() 
    { 
     Derived<E>::value; // only reason to want this is to 
     Derived<int>::value; // use different specializations 
    } 
}; 

當然,如果你不需要重新專注於Derived<something_else>,只是忽視的事實是Derived<E>是一個模板專業化:

template<class Derived> 
struct X 
{ 
    static void f() 
    { 
     Derived::value; 
    } 
}; 

X< my_class<something> > my_x; // a specialized class template is a class 
2

您的模板參數Derived是一個模板本身,E是它的形式參數。 你也需要爲它傳遞一個值。

也許你需要以下條件:

template<template<class E>class Derived, class T> 
struct X 
{ 
    static void f() 
    { 
     Derived<T>::value; 
    } 
}; 
+0

現在`E`是未使用... – Potatoswatter 2010-11-27 21:37:06

1

,因爲它在這裏只意味着Derived恰好與一個類型參數的模板不能使用該參數。

你會打電話f這樣的:

template <class T> 
struct ZZZ {}; 

X<ZZZ>::f(); 
    ^^^ 

注意,有在這個實例沒有E

除非有一個理由使用模板的模板,你可以只使用一個普通的模板,否則你就需要通過E作爲單獨的參數,進行調用是這樣的:

X<ZZZ, int>::f(); 
1

你只是讓你的語法有點混亂。

template<class E> 
struct X 
{ 
    static void f() 
    { 
     Derived<E>::value; 
    } 
} 

應該可以正常工作。