考虑以下代码示例:
// 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中文网其他相关文章!