Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Operator Lebih Muatan dalam Fail Pengepala Membawa kepada Ralat Berbilang Definisi?

Mengapa Operator Lebih Muatan dalam Fail Pengepala Membawa kepada Ralat Berbilang Definisi?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-19 05:06:02776semak imbas

Why Does Operator Overloading in a Header File Lead to Multiple Definition Errors?

Berbilang Takrifan Lebihan Operator dalam Fail Pengepala

Dalam contoh kod yang disediakan, pengkompil menghadapi ralat definisi berganda untuk operator<< ; lebihan untuk kelas Kompleks. Walaupun melindungi fail pengepala dengan pengawal prapemproses, ralat ini timbul disebabkan oleh takrifan operator<< fungsi diletakkan di dalam pengepala.

Khususnya, baris std::ostream& operator<<(std::ostream& o, const Complex& Cplx) dalam fail pengepala bukan pengisytiharan, tetapi sebaliknya definisi. Akibatnya, apabila kedua-dua complex.cpp dan main.cpp menyertakan fail pengepala, pengkompil mengesan definisi pendua operator<< fungsi semasa memaut.

Tidak seperti fungsi ahli real(), yang secara tersirat sebaris dan oleh itu tidak terdedah kepada ralat definisi berbilang, operator<< beban berlebihan ditakrifkan secara eksplisit dalam fail pengepala. Oleh itu, ia mesti ditandakan secara eksplisit sebagai sebaris menggunakan kata kunci sebaris untuk membolehkan definisi berbilang.

inline std::ostream& operator<<(std::ostream& o, const Complex& Cplx) {
    return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}

Sebagai alternatif, takrifan operator<< beban berlebihan boleh dialihkan ke fail sumber complex.cpp untuk mengelakkan ralat definisi berganda. Dengan mengasingkan pengisytiharan dan definisi, pengkompil boleh mengendalikan rujukan kepada operator dengan betul<< berfungsi dalam main.cpp tanpa menemui pelbagai definisi.

Atas ialah kandungan terperinci Mengapa Operator Lebih Muatan dalam Fail Pengepala Membawa kepada Ralat Berbilang Definisi?. 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