Rumah pembangunan bahagian belakang C++ Ralat kompilasi C++: Tidak boleh memanggil fungsi ahli ditukar daripada jenis yang tidak menentu, bagaimana untuk menanganinya?

Ralat kompilasi C++: Tidak boleh memanggil fungsi ahli ditukar daripada jenis yang tidak menentu, bagaimana untuk menanganinya?

Aug 21, 2023 pm 09:28 PM
c++ volatile Ralat kompilasi

C++ ialah bahasa yang ditaip kuat yang mengehadkan penukaran jenis pembolehubah Walau bagaimanapun, dalam beberapa kes, kami mungkin perlu melakukan penukaran jenis pada objek jenis yang tidak menentu, terutamanya dalam pembangunan terbenam, kami selalunya perlu mengakses daftar perkakasan biasanya jenis yang tidak menentu. Walau bagaimanapun, kerana objek jenis tidak menentu mempunyai semantik khas, pengkompil C++ akan mengenakan beberapa sekatan khas ke atasnya, yang membawa kepada ralat "Tidak boleh memanggil fungsi ahli ditukar daripada jenis yang tidak menentu". Artikel ini akan menerangkan punca ralat ini dan cara menanganinya.

Pertama, mari kita lihat semantik jenis yang tidak menentu. Dalam C++, peranan kata kunci yang tidak menentu adalah untuk memberitahu pengkompil bahawa nilai pembolehubah ini boleh diubah suai di luar program, jadi pengkompil tidak boleh mengoptimumkannya dan mesti memastikan bahawa nilainya dibaca semula setiap kali ia diakses. Khususnya, objek yang tidak menentu mempunyai ciri-ciri berikut:

  • Nilai objek yang tidak menentu boleh diubah suai di luar program, seperti gangguan perkakasan, pelbagai benang, dsb.
  • Setiap kali objek yang tidak menentu diakses, nilainya mesti dibaca semula, dan nilai cache dalam daftar tidak boleh digunakan secara langsung.
  • Akses kepada objek yang tidak menentu tidak boleh disusun semula atau dioptimumkan dan mesti dilakukan mengikut susunan dalam program.

Di bawah semantik ini, kita boleh menggunakan objek jenis meruap untuk mewakili daftar perkakasan Perlu diingat bahawa objek jenis meruap tidak boleh ditukar kepada dan daripada objek jenis tidak meruap, kerana ini akan memusnahkan semantik khasnya. Sebagai contoh, kod berikut adalah salah:

int x = 0;
volatile int &y = x;   // 复制x的地址,但y是volatile类型

x = 1;  // OK,修改x的值
y = 2;  // OK,修改x的值,但要重新读取其值
int z = y;  // 错误,不能读取volatile对象的值
int &u = y;  // 错误,不能将volatile类型的引用转换为非volatile类型
Salin selepas log masuk

Dalam kod di atas, kami cuba menukar pembolehubah tidak meruap x kepada rujukan meruap y, iaitu salah. Walaupun dengan melakukan ini, kita boleh mengubah suai nilai x melalui y dan membaca semula nilainya dengan setiap pengubahsuaian, kita tidak boleh membaca nilai y seperti integer biasa kerana ini akan melanggar semantik jenis yang tidak menentu.

Melangkah lebih jauh, mari kita pertimbangkan situasi yang lebih kompleks, iaitu memanggil fungsi ahli pada objek jenis yang tidak menentu. Sebagai contoh, kita boleh mengisytiharkan fungsi ahli objek sebagai jenis yang tidak menentu, supaya keterlihatan pembolehubah ahlinya boleh dijamin apabila ia dipanggil. Walau bagaimanapun, pengkompil C++ tidak membenarkan penukaran daripada jenis tidak menentu kepada jenis tidak menentu, jadi ralat penyusunan "Tidak boleh memanggil fungsi ahli ditukar daripada jenis meruap" akan berlaku. Contohnya:

class MyClass {
public:
    volatile int x;
    volatile void func() { x = x + 1; }
};

int main() {
    MyClass obj;
    obj.func();  // 错误,不能从volatile类型转换为非volatile类型
    return 0;
}
Salin selepas log masuk

Dalam kod di atas, kami mentakrifkan kelas MyClass, di mana x ialah integer jenis meruap dan func() ialah fungsi ahli jenis meruap, yang bermaksud untuk melaksanakan operasi kenaikan automatik pada x. Dalam fungsi main(), kami mencipta obj objek MyClass dan cuba memanggil fungsi ahlinya func(). Walau bagaimanapun, ini akan menyebabkan ralat kompilasi "Tidak boleh memanggil fungsi ahli ditukar daripada jenis yang tidak menentu". Ini kerana, dalam C++, fungsi ahli dianggap sebagai fungsi biasa dengan parameter penunjuk ini tersembunyi, jadi apabila memanggil fungsi ahli, menukar penunjuk ini daripada jenis tidak meruap kepada jenis tidak menentu adalah tidak dibenarkan.

Jadi, bagaimana kita harus menangani ralat kompilasi ini? Terdapat dua cara untuk menyelesaikan masalah ini. Kaedah pertama adalah untuk mengisytiharkan parameter fungsi ahli sebagai jenis yang tidak menentu supaya pengkompil tidak akan melaporkan ralat. Sebagai contoh:

class MyClass {
public:
    volatile int x;
    void func(volatile MyClass *thisptr) { thisptr->x = thisptr->x + 1; }
};

int main() {
    MyClass obj;
    obj.func(&obj);  // OK,将this指针转换为volatile类型
    return 0;
}
Salin selepas log masuk

Dalam kod di atas, kami mengisytiharkan parameter thisptr fungsi func() sebagai penunjuk MyClass jenis meruap, supaya apabila memanggilnya, penunjuk ini boleh ditukar daripada jenis tidak meruap kepada jenis yang tidak menentu. Walaupun pendekatan ini boleh menyelesaikan masalah, ia menjadikan kod itu bertele-tele dan tidak begitu biasa digunakan.

Kaedah kedua ialah menggunakan teknologi pemadaman jenis untuk menukar penunjuk fungsi ahli ini kepada penunjuk kosong, supaya sekatan pengkompil pada jenis yang tidak menentu boleh dipintas. Contohnya:

class MyClass {
public:
    volatile int x;
    void func() {
        volatile void *vthis = static_cast<volatile void *>(this);
        volatile MyClass *vptr = static_cast<volatile MyClass *>(vthis);
        vptr->x = vptr->x + 1;
    }
};

int main() {
    MyClass obj;
    obj.func();  // OK,使用类型擦除将this指针转换为volatile类型
    return 0;
}
Salin selepas log masuk

Dalam kod di atas, kami menggunakan static_cast untuk menukar penuding ini kepada penuding kosong dahulu, dan kemudian kepada penuding MyClass yang tidak menentu, supaya kita boleh mendapatkan penunjuk ini yang tidak menentu. Walaupun pendekatan ini boleh menyelesaikan masalah, ia memerlukan pemahaman cara menggunakan teknik pemadaman jenis dan boleh menjejaskan kebolehbacaan dan kebolehselenggaraan kod.

Ringkasnya, ralat kompilasi C++ "Tidak boleh memanggil fungsi ahli ditukar daripada jenis yang tidak menentu" disebabkan oleh sekatan khas pengkompil pada jenis yang tidak menentu. Untuk menyelesaikan ralat kompilasi ini, kita boleh mengisytiharkan parameter fungsi ahli sebagai jenis yang tidak menentu, atau menggunakan teknologi pemadaman jenis untuk menukar penunjuk fungsi ahli ini kepada penunjuk lompang. Tidak kira kaedah mana yang digunakan, anda perlu memberi perhatian kepada semantik jenis yang tidak menentu untuk mengelakkan menukar objek yang tidak menentu kepada objek yang tidak menentu dan sebaliknya, yang mungkin membawa kepada keputusan yang salah.

Atas ialah kandungan terperinci Ralat kompilasi C++: Tidak boleh memanggil fungsi ahli ditukar daripada jenis yang tidak menentu, bagaimana untuk menanganinya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah peranan char dalam c strings Apakah peranan char dalam c strings Apr 03, 2025 pm 03:15 PM

Dalam C, jenis char digunakan dalam rentetan: 1. Simpan satu watak; 2. Gunakan array untuk mewakili rentetan dan berakhir dengan terminator null; 3. Beroperasi melalui fungsi operasi rentetan; 4. Baca atau output rentetan dari papan kekunci.

Cara Mengira C-SubScript 3 Subscript 5 C-SubScript 3 Subscript 5 Algoritma Tutorial Cara Mengira C-SubScript 3 Subscript 5 C-SubScript 3 Subscript 5 Algoritma Tutorial Apr 03, 2025 pm 10:33 PM

Pengiraan C35 pada dasarnya adalah matematik gabungan, yang mewakili bilangan kombinasi yang dipilih dari 3 dari 5 elemen. Formula pengiraan ialah C53 = 5! / (3! * 2!), Yang boleh dikira secara langsung oleh gelung untuk meningkatkan kecekapan dan mengelakkan limpahan. Di samping itu, memahami sifat kombinasi dan menguasai kaedah pengiraan yang cekap adalah penting untuk menyelesaikan banyak masalah dalam bidang statistik kebarangkalian, kriptografi, reka bentuk algoritma, dll.

Empat cara untuk melaksanakan multithreading dalam bahasa c Empat cara untuk melaksanakan multithreading dalam bahasa c Apr 03, 2025 pm 03:00 PM

Multithreading dalam bahasa dapat meningkatkan kecekapan program. Terdapat empat cara utama untuk melaksanakan multithreading dalam bahasa C: Buat proses bebas: Buat pelbagai proses berjalan secara bebas, setiap proses mempunyai ruang ingatan sendiri. Pseudo-Multithreading: Buat pelbagai aliran pelaksanaan dalam proses yang berkongsi ruang memori yang sama dan laksanakan secara bergantian. Perpustakaan multi-threaded: Gunakan perpustakaan berbilang threaded seperti PTHREADS untuk membuat dan mengurus benang, menyediakan fungsi operasi benang yang kaya. Coroutine: Pelaksanaan pelbagai threaded ringan yang membahagikan tugas menjadi subtask kecil dan melaksanakannya pada gilirannya.

Definisi nama fungsi dalam bahasa c Definisi nama fungsi dalam bahasa c Apr 03, 2025 pm 10:03 PM

Definisi nama fungsi bahasa C termasuk: jenis nilai pulangan, nama fungsi, senarai parameter dan badan fungsi. Nama fungsi harus jelas, ringkas dan bersatu dalam gaya untuk mengelakkan konflik dengan kata kunci. Nama fungsi mempunyai skop dan boleh digunakan selepas pengisytiharan. Penunjuk fungsi membolehkan fungsi diluluskan atau ditugaskan sebagai hujah. Kesalahan umum termasuk konflik penamaan, ketidakcocokan jenis parameter, dan fungsi yang tidak diisytiharkan. Pengoptimuman prestasi memberi tumpuan kepada reka bentuk dan pelaksanaan fungsi, sementara kod yang jelas dan mudah dibaca adalah penting.

Fungsi Penggunaan Fungsi Jarak Jarak Jarak Penggunaan C Tutorial Penggunaan Fungsi Penggunaan Fungsi Jarak Jarak Jarak Penggunaan C Tutorial Penggunaan Apr 03, 2025 pm 10:27 PM

STD :: Unik menghilangkan elemen pendua bersebelahan di dalam bekas dan menggerakkannya ke akhir, mengembalikan iterator yang menunjuk ke elemen pendua pertama. STD :: Jarak mengira jarak antara dua iterators, iaitu bilangan elemen yang mereka maksudkan. Kedua -dua fungsi ini berguna untuk mengoptimumkan kod dan meningkatkan kecekapan, tetapi terdapat juga beberapa perangkap yang perlu diberi perhatian, seperti: STD :: Unik hanya berkaitan dengan unsur -unsur pendua yang bersebelahan. STD :: Jarak kurang cekap apabila berurusan dengan Iterator Akses Bukan Rawak. Dengan menguasai ciri -ciri dan amalan terbaik ini, anda boleh menggunakan sepenuhnya kuasa kedua -dua fungsi ini.

Bagaimana cara menggunakan nomenclature ular dalam bahasa c? Bagaimana cara menggunakan nomenclature ular dalam bahasa c? Apr 03, 2025 pm 01:03 PM

Dalam bahasa C, nomenclature ular adalah konvensyen gaya pengekodan, yang menggunakan garis bawah untuk menyambungkan beberapa perkataan untuk membentuk nama pembolehubah atau nama fungsi untuk meningkatkan kebolehbacaan. Walaupun ia tidak akan menjejaskan kompilasi dan operasi, penamaan panjang, isu sokongan IDE, dan bagasi sejarah perlu dipertimbangkan.

Penggunaan Releaseemaphore dalam C Penggunaan Releaseemaphore dalam C Apr 04, 2025 am 07:54 AM

Fungsi Release_semaphore dalam C digunakan untuk melepaskan semaphore yang diperoleh supaya benang atau proses lain dapat mengakses sumber yang dikongsi. Ia meningkatkan kiraan semaphore dengan 1, yang membolehkan benang menyekat untuk meneruskan pelaksanaan.

C Programmer &#S Panduan Tingkah Laku Tidak Ditentukan C Programmer &#S Panduan Tingkah Laku Tidak Ditentukan Apr 03, 2025 pm 07:57 PM

Meneroka tingkah laku yang tidak ditentukan dalam pengaturcaraan C: Panduan terperinci artikel ini memperkenalkan e-book mengenai tingkah laku yang tidak ditentukan dalam pengaturcaraan C, sejumlah 12 bab yang meliputi beberapa aspek pengaturcaraan C yang paling sukar dan kurang dikenali. Buku ini bukan buku teks pengenalan untuk bahasa C, tetapi bertujuan untuk pembaca yang biasa dengan pengaturcaraan bahasa C, dan meneroka pelbagai situasi yang mendalam dan akibat yang berpotensi dari tingkah laku yang tidak ditentukan. Pengarang Dmitrysviridkin, editor Andrey Karpov. Selepas enam bulan penyediaan yang teliti, e-book ini akhirnya bertemu dengan pembaca. Versi bercetak juga akan dilancarkan pada masa akan datang. Buku ini pada asalnya dirancang untuk memasukkan 11 bab, tetapi semasa proses penciptaan, kandungannya terus diperkaya dan akhirnya diperluas kepada 12 bab-ini sendiri adalah kes klasik yang luar bounds, dan boleh dikatakan setiap pengaturcara C

See all articles