くろのすけです。質問させてください。
↓の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
インクルードガードは"翻訳単位"でしか効果を発揮しません。
Class_Club.h 内で operator<<() を実装してはいけません。
Class_Club.h 内では宣言だけしておき、 Class_Club.cpp 内で実装してください。
keichanさん
早速修正したところ、
コンパイルが通りました。
昨夜からずっと悩んでいました。
助かりました。
ありがとうございました。
整理だけしたいのですが、
operatorを使った多重定義は、
インクルードガードをしていても
「Class_Club.h 内で宣言をして、
Class_Club.cppで実装する!」
という理解すればよいでしょうか?
> operatorを使った多重定義は、
演算子だけではなく,関数の定義一般における話です。
# template, inline除く。
くろのすけです。
YuOさん、ご回答感謝です。
わかりました。どうもです!!
ツイート | ![]() |