我爲什麼能做到這一點並不:不要訪問模板模板參數
template<template<class E>class Derived>
struct X
{
static void f()
{
Derived<E>::value;
}
};
,我有是,我不能編譯爲我收到一個錯誤說的原因,這個代碼的問題該參數E尚未宣佈。有沒有辦法可以使用這個正式參數?
我爲什麼能做到這一點並不:不要訪問模板模板參數
template<template<class E>class Derived>
struct X
{
static void f()
{
Derived<E>::value;
}
};
,我有是,我不能編譯爲我收到一個錯誤說的原因,這個代碼的問題該參數E尚未宣佈。有沒有辦法可以使用這個正式參數?
模板模板參數的參數不會獲取參數,因此通常不會有名稱。部分專業化是這個規則的例外。試試這個:
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
您的模板參數Derived
是一個模板本身,E
是它的形式參數。 你也需要爲它傳遞一個值。
也許你需要以下條件:
template<template<class E>class Derived, class T>
struct X
{
static void f()
{
Derived<T>::value;
}
};
,因爲它在這裏只意味着Derived
恰好與一個類型參數的模板不能使用該參數。
你會打電話f
這樣的:
template <class T>
struct ZZZ {};
X<ZZZ>::f();
^^^
注意,有在這個實例沒有E
。
除非有一個理由使用模板的模板,你可以只使用一個普通的模板,否則你就需要通過E
作爲單獨的參數,進行調用是這樣的:
X<ZZZ, int>::f();
你只是讓你的語法有點混亂。
template<class E>
struct X
{
static void f()
{
Derived<E>::value;
}
}
應該可以正常工作。
現在`E`是未使用... – Potatoswatter 2010-11-27 21:37:06