头文件中的多个定义错误:为什么以及如何解决它们
编译器在出现多个定义时会遇到“多个定义”错误同一程序中符号的定义。当多个源文件包含相同的头文件,并且每个头文件定义相同的符号时,就会发生这种情况。
让我们检查一下提供的代码示例:
// 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中文网其他相关文章!