簡體   English   中英

嵌套類模板專業化

[英]Nested class template specialization

一類:

template<typename C, typename T>
class A
{
    template <typename U>
    class Nested{};

    Nested<T> n;
};

我想專門研究Nested 這是我嘗試的:

template<typename C, typename T>
class A
{
    template <typename U>
    class Nested{};

    template <>
    class Nested<int>{}; // by my logic this should work by I have a compilation error "explicit specialization in non-namespace scope 'class A<C, T>'"

    Nested<T> n;
};

我的下一個嘗試:

template<typename C, typename T>
class A
{
    template <typename U>
    class Nested{};

    Nested<T> n;
};

template<>
A<>::Nested<int>{}; // What is the correct syntax to do it here? Now I have an error "wrong number of template arguments (0, should be 2)"

在stackoverflow上,我找到了解決方案:

template<typename C, typename T>
class A
{
    template <typename U, bool Dummy = true>
    class Nested{}; // why need of this Dummy??

    template <bool Dummy>
    class Nested<int, Dummy>{}; // why need to provide an argument??

    Nested<T> n;
};

它完美地工作,但我不知道如何。 為什么要提供虛擬模板參數? 為什么不能使用原始專業化template<> class Nested<int, true>{}template<> class Nested<int>{}

禁止在class-scope中創建顯式的專業化:

顯式專門化必須在包含專門化模板的命名空間中聲明。

但是禁止創建部分專業化:

可以在可以定義其定義的任何名稱空間范圍內聲明或重新聲明類模板部分專業化(14.5.1和14.5.2)。

這個

template <bool Dummy>
class Nested<int, Dummy>{}; // why need to provide an argument??

是局部專業化,並且允許在類范圍內創建此類專業化。 您還不能在非專業的外部類中完全專門化嵌套類。 你可以這樣做:

template<>
template<>
class A<int, double>::Nested<int>
{
};

但是你做不到

template<typename C, typename T>
template<>
class A<C, T>::Nested<int>
{
};

通過在外部類中定義專用模板類的所有內容,我設法使它起作用。 因此,所有功能都與類定義一起完全定義。 沒有外部函數定義,因為似乎沒有遵守。

template <typename T, size_t N>
class A
{
private:
    template <size_t M>
    class B
    {
        ...
    };

    template <>
    class B<2>
    {
        ...
    };
    ... etc
};

它至少在MS2015上有效。 代碼運行良好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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