[解決済み] リンカーエラー (link2005, link1169)
質問
コンパイルしようとすると、このようなエラーが発生します。
全てのエラーを解決しようと頑張ったのですが、この3つが勝ってしまいました。私は初心者なので4時間も頑張りました。本当に皆さんの助けをお願いします。
1)
エラー1 エラー LNK2005: "class std::basic_istream > & __cdecl cs52::operator>>(class std::basic_istream > &,class cs52::SwimmingPool &)" (?)。 ?5cs52@YAAAV?$basic_istream@DU?$char_traits@D@std@AAV12@AAVSwimmingPool@0@Z) POOL.obj ですでに定義されています。
2)
エラー2 エラー LNK2005: "class std::basic_ostream > & __cdecl cs52::operator<<(class std::basic_ostream > &,class cs52::SwimmingPool const &)" (?). ?6cs52@YAAAV?$basic_ostream@DU?$char_traits@D@std@AAV12@ABVSwimmingPool@0@Z) POOL.obj で既に定義されています。
3)
エラー3 エラー LNK1169: 1つ以上の多重定義されたシンボルが見つかりました。
これは私のコードです。
1)ヘッダー
#ifndef POOL_H
#define POOL_H
#include<iostream>
namespace cs52
{
class SwimmingPool{
public:
SwimmingPool(int size);
void fill(int amount);
void splash();
void swim();
void evaporate(int amount);
int getSize();
int getContents();
void setSize(int size);
private:
int mySize; // in gallons
int myContents; // in gallons
friend std::ostream& operator<<(std::ostream& outs, const SwimmingPool & pool);
friend std::istream& operator>>(std::istream& ins, SwimmingPool & pool);
friend SwimmingPool operator +(SwimmingPool& d, SwimmingPool& d2);
friend SwimmingPool operator -(SwimmingPool& d, SwimmingPool& d2);
};
bool operator >(SwimmingPool& d, SwimmingPool& d2);
bool operator <(SwimmingPool& d, SwimmingPool& d2);
bool operator ==(SwimmingPool& d, SwimmingPool& d2);
bool operator !=(SwimmingPool& d, SwimmingPool& d2);
std::ostream& operator<<(std::ostream& outs, const SwimmingPool & pool){
outs << "size " << pool.mySize << " contents " << pool.myContents;
return outs;
}
std::istream& operator>> (std::istream& ins, SwimmingPool & pool)
{
std::cout << "enter size of pool\n";
ins >> pool.mySize;
pool.myContents = 0;
return ins;
}
}
#endif
2) これが私の最初のcppファイルです
#include "POOL.h"
using namespace std;
using namespace cs52;
SwimmingPool::SwimmingPool(int size)
{
mySize = size;
myContents = 0;
}
void SwimmingPool::fill(int amount)
{
myContents += amount;
}
void SwimmingPool::splash()
{
cout << "splash" << std::endl;
}
void SwimmingPool::evaporate(int amount)
{
myContents -= amount;
}
int SwimmingPool::getSize()
{
return mySize;
}
int SwimmingPool::getContents()
{
return myContents;
}
void SwimmingPool::swim()
{
cout << "swimming\n";
}
bool cs52::operator >(SwimmingPool& d, SwimmingPool& d2)
{
if (d2.getSize() <d.getSize())
{
return true;
}
return false;
}
bool cs52::operator <(SwimmingPool& d, SwimmingPool& d2)
{
if (d2.getSize() >d.getSize())
{
return true;
}
return false;
}
bool cs52::operator ==(SwimmingPool& d, SwimmingPool& d2)
{
if (d2.getSize() == d.getSize())
{
return true;
}
return false;
}
bool cs52::operator !=(SwimmingPool& d, SwimmingPool& d2)
{
if (d2.getSize() != d.getSize())
{
return true;
}
return false;
}
SwimmingPool cs52::operator +(SwimmingPool& d, SwimmingPool& d2)
{
SwimmingPool s(d.getSize() + d2.getSize());
s.fill(d.getContents() + d2.getContents());
return s;
}
SwimmingPool cs52::operator -(SwimmingPool& d, SwimmingPool& d2)
{
if (d.getSize() >= d2.getSize() && d.getSize() >= d2.getSize())
{
SwimmingPool s(d.getSize() - d2.getSize());
s.fill(d.getContents() - d2.getContents());
return s;
}
else
cout << "ERROR\n";
return 0;
}
3) これは私のメイン cpp ファイルです。
#include "POOL.h"
#include<iostream>
using namespace std;
using namespace cs52;
int main()
{
SwimmingPool smallOne(1);
SwimmingPool bigOne(1000);
bigOne.fill(100);
SwimmingPool yours(10);
yours.fill(1);
SwimmingPool mine(20);
mine.fill(19);
cout << "--some tests follow--" << endl;
SwimmingPool pool1 = mine + mine;
SwimmingPool pool2 = yours - yours;
if (pool1 > pool2) {
cout << "> is working..." << endl;
}
if (pool1 != pool2) {
cout << "!= is working..." << endl;
}
if (pool2 < pool1) {
cout << "< is working..." << endl;
}
if (pool1 == pool1) {
cout << "== is working..." << endl;
}
cout << "---printing pool1---" << endl;
cout << pool1 << endl;
cout << "---printing pool2---" << endl;
cout << pool2 << endl;
cout << "---reading pool1---" << endl;
cin >> pool1;
cout << "---printing a revised pool1---" << endl;
cout << pool1 << endl;
cout << "---some broken code follows---" << endl;;
SwimmingPool badPool = smallOne - bigOne;
system("pause");
return 0;
}
よろしくお願いします。
どのように解決するのですか?
あなたは、あなたを定義します。
operator <<
と
operator >>
をヘッダーファイルの中で解放してください。このため、実装が両方のオブジェクトファイルにコンパイルされ、重複した定義が行われることになります。
のどちらかをしなければなりません。
-
として宣言します。
inline
- 実装をCPPファイル内に移動する
-
オーバーロードされたメソッドをクラスのメンバとし、クラス定義体で直接実装する (これにより、事実上
inline
)
オプション1では、コンパイラは関数を定義せず、代わりにその実装を呼び出される場所にコピーします。これは、DLLにコンパイルされたAPIの一部である場合に問題を引き起こす可能性があります。関数の変更は、DLLが交換されたときに既存のプログラムに影響を与えません。なぜなら、実装は主要な人工物の中にあるからです(バイナリ互換性は失われます)。
オプション2は、演算子の実装をクラスの実装と結びつけるものであり、最良の選択肢であると思います。
なぜなら、あなたのクラスは演算子のLHSでなければならないからです(演算子のオーバーロード・メソッドは、あなたのクラスのオブジェクト上で呼び出されます)。これは、入力/抽出演算子の場合ではありません。
関連
-
[解決済み】coutはstdのメンバではない
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー