非命名空間範圍內的明確專業化問題
在命名空間之外編譯具有明確專業化的C 類模板時,某些編譯器(如g)可能會引發錯誤,指出「非命名空間範圍中的明確專業化」。出現此問題的原因是類別模板及其成員函數的明確特化應駐留在模板聲明的命名空間內。
明確特化的相關 C 03 標準(第 §14.7.3/2)指定:
「應在模板所屬的命名空間中聲明顯式專業化,或者,對於成員模板,應在封閉類或封閉類模板所屬的命名空間。」
這意味著,Verify() 方法的明確特化應在聲明CConstraint 類別的命名空間內宣告。
此外,根據 C 03,§14.7.3/3,成員函數的顯式特化需要外圍函數的明確特化 班級。要解決此問題,請考慮將verify() 方法轉發到嵌套命名空間中的明確的、可能專門化的自由函數:
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中文網其他相關文章!