error LNK2005 & LNK1169というエラーをとるには?

解決


くろのすけ  2006-12-28 19:44:56  No: 64116

くろのすけです。質問させてください。

↓の2つのファイルを使っています。
  main.cpp
  Class_Club.h
main.cppで、Class_Club.hをインクルードしています。
(※ Class_Club.hの大雑把な構成は下に書きます。)
新たに、Class_Club.cppというファイルを作成し、
(他の内容は書かないで)Class_Club.hをインクルードのみすると、
次のようなエラーが出ます。
ヘッダ(Class_Club.h)内では、
#if !defined(___Class_Club_h)でインクルードガードもしていますし、
何故このようなエラーが出るのか疑問です。
どなたか教えてください!!

///////// エラー/////////////////////
main.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Club const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABVClub@@@Z) は既に Class_Club.obj で定義されています。
D:\VisualC++2005\original\RankPro\Debug\RankPro.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
/////////////////////////////////////

------ Class_Club.h ------

#if !defined(___Class_Club_h)
  #define   ___Class_Club_h

*********定数定義*********
#define ○○○○○○○

using namespace std;

*********関数宣言*********
void func○○○○○○○

*********クラス***********
class Victory
{
protected:
   ○○○○○○
public:
   ○○○○○○
};

class Goal
{
protected:
   ○○○○○○
public:
   ○○○○○○
};

//=== Club class ===//
class Club : protected Victory, protected Goal {
protected:
   ○○○○○○
public:
   ○○○○○○
};

//=== Club class ===//
ostream& operator<<( ostream& s, const Club& x )
{
  return s << ○○○○○○;
}

#endif


keichan  2006-12-28 20:22:21  No: 64117

インクルードガードは"翻訳単位"でしか効果を発揮しません。
Class_Club.h 内で operator<<() を実装してはいけません。
Class_Club.h 内では宣言だけしておき、 Class_Club.cpp 内で実装してください。


くろのすけ  2006-12-28 20:32:33  No: 64118

keichanさん

早速修正したところ、
コンパイルが通りました。
昨夜からずっと悩んでいました。
助かりました。
ありがとうございました。

整理だけしたいのですが、
  operatorを使った多重定義は、
  インクルードガードをしていても
  「Class_Club.h 内で宣言をして、
  Class_Club.cppで実装する!」
という理解すればよいでしょうか?


YuO  2006-12-28 20:43:52  No: 64119

>   operatorを使った多重定義は、
演算子だけではなく,関数の定義一般における話です。
# template, inline除く。


くろのすけ  2006-12-28 21:00:36  No: 64120

くろのすけです。

YuOさん、ご回答感謝です。
わかりました。どうもです!!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加