首頁 > 後端開發 > C++ > 為什麼類別成員的明確特化在 C 中的命名空間之外失敗?

為什麼類別成員的明確特化在 C 中的命名空間之外失敗?

Susan Sarandon
發布: 2024-12-06 04:49:21
原創
257 人瀏覽過

Why Does Explicit Specialization of Class Members Fail Outside a Namespace in C  ?

命名空間範圍外的明確專業化:非標準G 中的錯誤

C 模板程式設計涉及類別成員的明確專業化,以實現高效代碼世代。然而,顯式專業化的放置至關重要,如以下程式碼片段所示:

template<typename T>
class CConstraint
{
    // ...

    template <typename TL>
    void Verify(int position, int constraints[])
    {
    }

    template <>
    void Verify<int>(int, int[])
    {
    }
};
登入後複製

當使用g 編譯時,此程式碼會導致錯誤:

Explicit specialization in non-namespace scope 'class CConstraint'
登入後複製

要要理解對於此錯誤,我們需要檢查C 標準,該標準規定必須在模板所屬的命名空間內聲明顯式專業化。在上面的範例中,CConstraint 未在任何名稱空間內聲明,因此,Verify 的明確特化是有效的。無效。

然而,VC 編譯器在這種情況下是不相容的,允許在命名空間範圍之外進行明確專業化。此行為是非標準的,不應依賴。

解決方案:

要解決此問題並確保符合 C 標準,必須聲明顯式專業化與它們專門的模板位於同一名稱空間內。以下是程式碼的修正版本:

namespace MyNamespace
{
    template<typename T>
    class CConstraint
    {
        // ...

        template <typename TL>
        void Verify(int position, int constraints[])
        {
        }

        template <>
        void Verify<int>(int, int[])
        {
        }
    };
}
登入後複製

透過將 CConstraint 封裝在 MyNamespace 命名空間中,我們確保其明確專業化也在該命名空間中聲明,從而解決了編譯錯誤。

此外,由於C 03 禁止在沒有明確專門化包含類別的情況下專門化成員函數,因此我們還可以考慮使用自由函數方法,如提供的中所建議的答案:

namespace detail {
    template <typename TL> void Verify(int, int[]) {}
    template <>            void Verify<int>(int, int[]) {}
}

template<typename T> class CConstraint {
    // ...
    template <typename TL> void Verify(int position, int constraints[]) {
        detail::Verify<TL>(position, constraints);
    }
};
登入後複製

以上是為什麼類別成員的明確特化在 C 中的命名空間之外失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板