[英]Template specializations for inner class
考慮以下代碼:
struct X
{
template <typename T>
class Y
{};
};
template<>
class X::Y<double>{
};
這里我們專門為類型double的Y類,代碼工作正常。 問題是,如果我將代碼更改為:
template<typename A>
struct X
{
template <typename T>
class Y
{};
};
template<typename A>
class X<A>::Y<double>{
};
編譯器將報告錯誤:
'X :: Y':顯式特化是使用部分特化語法,而是使用模板<>!
任何人都知道如何在這種情況下專注Y級?
如果沒有明確地專門化外部模板類,則無法專門化內部模板類。 有關詳細信息和標准引用,請參閱此問題。
解決方法:創建一個外部類,它在詳細名稱空間中同時包含T
和A
,並在X
別名:
namespace impl
{
template <typename A, typename T>
struct Y { };
}
template<typename A>
struct X
{
template <typename T>
using Y = impl::Y<A, T>;
};
如果您可以明確專門化內部和外部類,則可以使用以下語法:
template <>
template <>
class X<int>::Y<double>
{
// ...
};
簡單的答案 - 你不能完全專門化模板外層的模板化內部類。 但是如果你真的想要達到類似的效果,你可以嘗試使用虛擬默認模板參數進行部分專業化:
#include <iostream>
template<typename A>
struct X
{
template <typename T, T* =nullptr>
class Y{};
};
template<typename A>
template<double *Ptr>
class X<A>::Y<double, Ptr> {
public:
static constexpr int value = 1;
};
int main() {
std::cout << X<int>::Y<double>::value << std::endl;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.