頭檔中的多個定義錯誤:為什麼以及如何解決它們
編譯器在出現多個定義時會遇到“多個定義」錯誤同一程式中符號的定義。當多個來源文件包含相同的頭文件,並且每個頭文件定義相同的符號時,就會發生這種情況。
讓我們檢查一下提供的程式碼範例:
// complex.h #include <iostream> class Complex { public: Complex(float Real, float Imaginary); float real() const { return m_Real; }; private: friend std::ostream& operator<< (std::ostream&, const Complex&); float m_Real; float m_Imaginary; }; std::ostream& operator<< (std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
運算子
// complex.cpp #include "complex.h" Complex::Complex(float Real, float Imaginary) { m_Real = Real; m_Imaginary = Imaginary; }
// main.cpp #include "complex.h" #include <iostream> int main() { Complex Foo(3.4, 4.5); std::cout << Foo << "\n"; return 0; }
編譯此程式碼時,編譯器遇到「多重定義」錯誤對於操作員
為什麼不使用 real()?
real() 成員函數是隱式內聯的,這意味著編譯器將其視為內聯函數,即使它被宣告為內聯函數.h中沒有明確指定
解決方案
解決運算符的多重定義問題
內嵌函數:
將inline關鍵字加入函數定義中以指示編譯器內聯它:
inline std::ostream& operator<< (std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
將定義移至.cpp 檔案:
刪除函數定義從.h 檔案中將其放入相應的.cpp文件中:
// complex.cpp std::ostream& operator<< (std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
其他解決方案
其他解決方案包括:
以上是為什麼頭檔中出現「多重定義」錯誤,如何修復它們?的詳細內容。更多資訊請關注PHP中文網其他相關文章!