ヘッダー ファイル内の演算子のオーバーロードが複数の定義エラーにつながるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-19 05:06:02
オリジナル
778 人が閲覧しました

Why Does Operator Overloading in a Header File Lead to Multiple Definition Errors?

ヘッダー ファイル内の演算子のオーバーロードの複数の定義

提供されたコード例では、コンパイラで演算子の複数定義エラーが発生しました<< ; Complex クラスのオーバーロード。ヘッダー ファイルをプリプロセッサ ガードで保護しているにもかかわらず、このエラーは演算子<<の定義が原因で発生します。

具体的には、ヘッダー ファイル内の行 std::ostream&operator<<(std::ostream& o, const Complex& Cplx) は宣言ではなく、定義です。その結果、complex.cpp と main.cpp の両方にヘッダー ファイルがインクルードされると、コンパイラは演算子<<の重複定義を検出します。

暗黙的にインライン化されるため、複数の定義エラーの影響を受けにくい real() メンバー関数とは異なり、演算子<<オーバーロードはヘッダー ファイルで明示的に定義されます。したがって、複数の定義を許可するには、inline キーワードを使用して明示的にインラインとしてマークする必要があります。

inline std::ostream& operator<<(std::ostream& o, const Complex& Cplx) {
    return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
ログイン後にコピー

あるいは、演算子<<の定義も可能です。多重定義エラーを防ぐために、オーバーロードを complex.cpp ソース ファイルに移動できます。宣言と定義を分離することにより、コンパイラは演算子<<への参照を正しく処理できます。 main.cpp 内の関数を複数の定義に遭遇することなく実行できます。

以上がヘッダー ファイル内の演算子のオーバーロードが複数の定義エラーにつながるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート