考慮以下程式碼範例:
// 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& o, const Complex& Cplx); 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; }
編譯此程式碼時程式碼中,編譯器報錯:
multiple definition of operator<<(std::ostream&, Complex const&)
這個錯誤的原因是運算子的定義
編譯器不會抱怨公用成員函數 real(),因為它是隱含的內聯。這意味著編譯器會在每個使用 real() 的翻譯單元中產生 real() 的程式碼。
此問題有兩個主要解:
製作運算子
透過標記運算子
inline std::ostream& operator<<(std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
行動運算子
或者,您可以定義運算子
除了使用inline關鍵字或將定義移動到原始文件,還有另一種可能的解決方案:
在函數定義中使用標頭保護:
您可以在函數定義周圍添加標頭保護以防止它被定義多次。
#ifndef OPERATOR_LT_LT_DEFINED #define OPERATOR_LT_LT_DEFINED std::ostream& operator<<(std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; } #endif // OPERATOR_LT_LT_DEFINED
以上是為什麼在多個來源檔案中包含帶有函數定義的頭檔會導致'多重定義”錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!