」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > C++類成員顯式特化為何在命名空間外失敗?

C++類成員顯式特化為何在命名空間外失敗?

發佈於2025-04-18
瀏覽:455

Why Does Explicit Specialization of Class Members Fail Outside a Namespace in C  ?
在命名空間範圍外的顯著專業:非標準G

c模板編程中的一個錯誤涉及對高效代碼生成的類成員的明確專業化。但是,如以下代碼段所示,顯式專業的放置至關重要: Template 班級 { // ... 模板 void驗證(int位置,int約束[]) { } 模板 void verify (int,int []) { } }; 在使用G進行編譯時,此代碼會導致錯誤:

在非Namespace範圍範圍'class cconstraint'

了解此錯誤。在上面的示例中,在任何名稱空間內都沒有聲明cconstraint,因此verifie 的明確專業化是無效的。

VC編譯器,但是在這種情況下,允許在命名空間範圍之外進行明確的專業知識。這種行為是非標準的,不應依靠。
template
class CConstraint
{
    // ...

    template 
    void Verify(int position, int constraints[])
    {
    }

    template 
    void Verify(int, int[])
    {
    }
};
解決此問題並確保符合C標準,必須在同一名稱空間中聲明其為他們專業的模板,必須在同一名稱空間內聲明明確的專業。這是代碼的更正版本:

名稱空間mynamespace { 模板 班級 { // ... 模板 void驗證(int位置,int約束[]) { } 模板 void verify (int,int []) { } }; }

通過在mynamespace名稱空間內封裝Cconstraint,我們確保在該命名空間內也聲明其明確的專業知識,從而解決了彙編錯誤。
Explicit specialization in non-namespace scope 'class CConstraint'
名稱空間詳細信息{ template void verify(int,int []){} template void verify (int,int []){} } 模板 class cconstraint { // ... template void verify(int位置,int限制[]){ 詳細信息::驗證(位置,約束); } };

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3