Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat sintaks C++: Rakan tidak boleh diisytiharkan dalam definisi templat kelas, bagaimana untuk membetulkannya?

Ralat sintaks C++: Rakan tidak boleh diisytiharkan dalam definisi templat kelas, bagaimana untuk membetulkannya?

WBOY
WBOYasal
2023-08-22 10:30:441328semak imbas

C++ ialah bahasa pengaturcaraan yang berkuasa dengan sintaks dan mekanisme templat yang kaya, membolehkan pembangun membina pelbagai struktur dan algoritma data yang kompleks. Tetapi apabila menggunakan C++, kita sering menghadapi pelbagai masalah, salah satunya adalah ralat pengisytiharan rakan.

Rakan ialah konsep penting dalam bahasa C++, yang membenarkan satu kelas atau fungsi mengakses ahli persendirian kelas lain. Dalam pembangunan sebenar, kita sering perlu menggunakan mekanisme rakan untuk mengakses ahli persendirian kelas lain, seperti melaksanakan beban berlebihan operator, menguji fungsi persendirian kelas, dsb. Walau bagaimanapun, menggunakan rakan dalam templat kelas adalah lebih sukar kerana jenis instantiasi dalam templat kelas tidak diketahui.

Punca masalah ialah rakan tidak boleh diisytiharkan dalam templat kelas kerana maklumat ahli dalam kelas tidak diketahui sebelum instantiasi Sebaik sahaja rakan diisytiharkan, ahli khusus untuk diakses mesti ditentukan. Ini membawa kepada ralat sintaks yang menyalahi undang-undang untuk mengisytiharkan rakan dalam definisi templat kelas. Contohnya:

template<class T>
class MyClass {
    friend class FriendClass; // 错误!
    T member;
};

Pada masa ini, pengkompil akan memberikan mesej ralat berikut:

error: template argument required for 'class FriendClass'
     friend class FriendClass;
                            ^

Jadi, bagaimana untuk membetulkan ralat ini?

Penyelesaian adalah dengan mengalihkan definisi rakan ke luar kelas. Apabila mengisytiharkan rakan di luar kelas, anda perlu menggunakan jenis instantiasi tertentu untuk menentukan ahli untuk diakses. Contohnya:

template<class T>
class MyClass;
 
template<class T>
class FriendClass {
public:
    void Print(MyClass<T>* myClass) {
        std::cout << myClass->member << std::endl;
    }
};
 
template<class T>
class MyClass {
    friend class FriendClass<T>; // 正确
public:
    T member;
};

Dalam contoh di atas, kami meletakkan pengisytiharan FriendClass di hadapan MyClass dan menyatakan jenis instantiasi T. Dengan cara ini, FriendClass boleh mengakses ahli dalam MyClass. Pada masa yang sama, kita juga perlu mengisytiharkan FriendClass sebagai rakan dalam MyClass, supaya MyClass boleh diakses dalam FriendClass.

Ringkasnya, adalah haram untuk mengisytiharkan rakan dalam templat kelas kerana jenis dalam templat kelas tidak diketahui. Jika anda perlu menggunakan mekanisme rakan untuk mengakses ahli persendirian kelas lain, anda harus mengalihkan definisi rakan ke luar kelas dan menentukan ahli untuk diakses dengan membuat instantiat jenis. Kaedah ini dapat mengelakkan kesalahan tatabahasa dan juga mencapai tujuan mekanisme rakan.

Atas ialah kandungan terperinci Ralat sintaks C++: Rakan tidak boleh diisytiharkan dalam definisi templat kelas, bagaimana untuk membetulkannya?. 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