簡體   English   中英

內部類的模板特化

[英]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級?

如果沒有明確地專門化外部模板類,則無法專門化內部模板類。 有關詳細信息和標准引用,請參閱此問題。

解決方法:創建一個外部類,它在詳細名稱空間中同時包含TA ,並在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>
{
    // ...
};

關於wandbox的示例

簡單的答案 - 你不能完全專門化模板外層的模板化內部類。 但是如果你真的想要達到類似的效果,你可以嘗試使用虛擬默認模板參數進行部分專業化:

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM