Rumah > pembangunan bahagian belakang > C++ > Mengapa Pengkhususan Eksplisit Ahli Kelas Gagal Di Luar Ruang Nama dalam C ?

Mengapa Pengkhususan Eksplisit Ahli Kelas Gagal Di Luar Ruang Nama dalam C ?

Susan Sarandon
Lepaskan: 2024-12-06 04:49:21
asal
239 orang telah melayarinya

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

Pengkhususan Eksplisit Di Luar Skop Ruang Nama: Ralat dalam Bukan Standard G

Pengaturcaraan templat C melibatkan pengkhususan eksplisit ahli kelas untuk kod yang cekap generasi. Walau bagaimanapun, penempatan pengkhususan eksplisit adalah penting, seperti yang ditunjukkan oleh coretan kod berikut:

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

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

    template <>
    void Verify<int>(int, int[])
    {
    }
};
Salin selepas log masuk

Apabila dikompilasi dengan g , kod ini mengakibatkan ralat:

Explicit specialization in non-namespace scope 'class CConstraint'
Salin selepas log masuk

Untuk memahami ralat ini, kita perlu meneliti piawaian C, yang menentukan bahawa pengkhususan eksplisit mesti diisytiharkan dalam ruang nama yang templatnya adalah ahli. Dalam contoh di atas, CConstraint tidak diisytiharkan dalam mana-mana ruang nama, dan oleh itu pengkhususan eksplisit Verify adalah tidak sah.

Penyusun VC, walau bagaimanapun, tidak mematuhi dalam kes ini, membenarkan pengkhususan eksplisit di luar skop ruang nama. Tingkah laku ini tidak standard dan tidak boleh dipercayai.

Penyelesaian:

Untuk menyelesaikan isu ini dan memastikan pematuhan dengan piawaian C, pengkhususan eksplisit mesti diisytiharkan dalam ruang nama yang sama dengan templat yang mereka pakar. Berikut ialah versi kod yang diperbetulkan:

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

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

        template <>
        void Verify<int>(int, int[])
        {
        }
    };
}
Salin selepas log masuk

Dengan merangkum CConstraint dalam ruang nama MyNamespace, kami memastikan bahawa pengkhususan eksplisitnya turut diisytiharkan dalam ruang nama itu, menyelesaikan ralat penyusunan.

Selain itu, memandangkan C 03 melarang pengkhususan fungsi ahli tanpa mengkhususkan kelas yang mengandungi secara eksplisit, kami juga boleh mempertimbangkan menggunakan pendekatan fungsi percuma, seperti yang dicadangkan dalam jawapan yang disediakan:

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);
    }
};
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Pengkhususan Eksplisit Ahli Kelas Gagal Di Luar Ruang Nama dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan