Rumah >pembangunan bahagian belakang >C++ >Mengapa Pengkhususan Eksplisit di Luar Ruang Nama Menyebabkan Ralat Penyusunan dalam C?

Mengapa Pengkhususan Eksplisit di Luar Ruang Nama Menyebabkan Ralat Penyusunan dalam C?

Linda Hamilton
Linda Hamiltonasal
2024-12-02 02:13:09709semak imbas

Why Do Explicit Specializations Outside a Namespace Cause Compilation Errors in C  ?

Isu Pengkhususan Eksplisit dalam Skop Bukan Ruang Nama

Apabila menyusun templat kelas C dengan pengkhususan eksplisit di luar ruang nama, sesetengah penyusun seperti g mungkin menimbulkan ralat menyatakan "Pengkhususan eksplisit dalam skop bukan ruang nama." Isu ini timbul kerana pengkhususan eksplisit templat kelas dan fungsi ahlinya harus berada dalam ruang nama pengisytiharan templat.

Piawaian C 03 yang berkaitan untuk pengkhususan eksplisit (bahagian §14.7.3/2) menyatakan bahawa:

"Pengkhususan eksplisit hendaklah diisytiharkan dalam ruang nama yang mana templat adalah ahli, atau, untuk templat ahli, dalam ruang nama yang kelas yang disertakan atau templat kelas yang disertakan adalah ahli."

Ini bermakna pengkhususan eksplisit kaedah Verify() hendaklah diisytiharkan dalam ruang nama tempat kelas CConstraint diisytiharkan.

Selain itu, menurut C 03, §14.7.3/3, pengkhususan eksplisit fungsi ahli memerlukan pengkhususan eksplisit kelas yang disertakan. Untuk menyelesaikan masalah ini, pertimbangkan untuk memajukan kaedah Verify() kepada fungsi bebas yang jelas dan berpotensi khusus dalam ruang nama bersarang:

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);
    }
};

Dengan merangkumkan pengkhususan eksplisit dalam ruang nama bersarang, pengkompil akan mengiktirafnya sebagai milik ruang nama templat, menyelesaikan ralat.

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

Kenyataan:
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