ヘッダー ファイルの複数の定義エラー: その原因と解決方法
複数のヘッダー ファイルが提示された場合、コンパイラーで「複数の定義」エラーが発生します。同じプログラム内のシンボルの定義。これは、複数のソース ファイルに同じヘッダー ファイルが含まれており、それぞれが同じシンボルを定義している場合に発生する可能性があります。
提供されたコード サンプルを調べてみましょう。
// 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; }
演算子<<関数は .h ファイルで定義されており、複数のソース ファイルに関数がインクルードされるため、複数定義の候補になります。
// 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 では明示的に指定されていません。 file.
解決策
演算子の複数定義の問題を解決するには<<関数の場合、主に 2 つの代替案があります:
関数をインライン化します:
関数定義に 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 中国語 Web サイトの他の関連記事を参照してください。