命名空間範圍外的明確專業化:非標準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中文網其他相關文章!