非命名空間範圍內的顯式專業化
查詢:
在 C模板類別中CConstraint,為什麼編譯器會在以下情況下產生錯誤「非命名空間範圍中的明確專業化」成員函數是明確特化的?
回應:
出現此問題的原因是 CConstraint 中的明確特化未在命名空間內聲明。根據 C 03 標準第 14.7.3/2 節,明確專業化必須駐留在模板的命名空間內,或對於成員模板,位於封閉類別或類別模板的命名空間內。
此外,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中文網其他相關文章!