0

今日は一日中コードに困惑しています。トラックやアルバムのコレクションを扱うクラスがたくさんあります。コードがコンパイルされ、ファイルが正常に読み込まれますが、アルバムコレクションクラスでistream&演算子を使用しようとすると、実行時にエラーが発生します。

これはエラーです:

   error LNK2001: unresolved external symbol "class std::basic_istream<char,struct    std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class AlbumCollection &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@AAVAlbumCollection@@@Z)1>C:\Users\Shardy\Desktop\AlbumDatabase\Debug\AlbumDatabase.exe : fatal error LNK1120: 1 unresolved externals

助けていただければ幸いです。それはイライラするようになります。私の本もグーグルも光を当てていません。御時間ありがとうございます。

4

2 に答える 2

0

いくつかの問題:

  1. main.c:ファイルが正常に開かれた場合、ファイルが正常にロードされたことを示します。ファイルがすでにロードされているのに、そもそもファイルをわざわざ開くのはなぜですか?うーん、どうしてそんなことができるの?
  2. main.c:ファイルから読み取るメソッドを呼び出すことはありません。
  3. main.c:if (file)代わりに使用できますif (file.is_open())
  4. main.c:ステートメントの締めくくり}がありません。if
  5. main.c:使用していないargcか、 としてargv宣言できます。mainmain(void)
  6. クラス宣言(ヘッダーファイル)とメソッド定義を投稿する必要があります。
  7. duration.cpp:入力メソッドは、「:」などの数値や空白以外の何かに遭遇するとギャグします。
  8. duration.cpp:加算演算子は、特にオーバーフローで時間演算を正しく実行しません。「00:02:30」に「00:59:35」を追加してみてください。
  9. duration.cpp:operator==コンマ、'、'演算子を使用しているため、最後の式の結果が返されます。&&または論理積演算子を使用することをお勧めします。
  10. duration.cpp:ルール3:コンストラクター、コピーコンストラクター、または破棄を定義する場合は、3つすべてと代入演算子を宣言する必要があります。
  11. duration.cpp:数学のルール:定義するoperator+か、 演算operator-子も実装する必要がある場合。Boost数学ライブラリを参照してください。+=-=
  12. duration.cpp:順序付けの規則:順序付けまたは比較を計画している場合は、演算子<, <=, ==, !=, >,とを実装する必要があり>=ます。ヒント:時間を秒に変換します。これにより、比較するときに生活が楽になります。boost::less_than_comparableを参照してください。
  13. track.cpp:入力メソッドは、最初にトラック名を読み取り、次に期間を読み取ります。データファイルには、最初に期間が表示され、次にトラック名が表示されます。また、期間と列の間のフィールド区切り文字を処理するコードもありません。

    Yep, a debugger would be helpful as well as pencil and paper to go through this code.

于 2012-12-09T19:22:14.700 に答える
0

自明なことに、あなたのメインには比類のない中括弧があります。elseステートメントの前に閉じ中括弧を付ける必要があります(つまり} else {...}

さらに重要なことに、私はあなたのメインにリストされている特定の問題に対処しようとします(コンパイルに関して)。まず、私の仮定をリストします。::見たところ、関数の実装にスコープ()を使用しているため、実装とインターフェイスは適切に分離されています(つまり、クラスはヘッダーファイルで宣言され、実装はソースファイルにあります) 。

さらに、あなたの実装はoperator<<、AlbumCollectionsの実装と同じファイルにあると思います。これは問題ありませんが、メインファイルはこれを認識していません。現在、ソースファイル用にのみコンパイルされています。これ以上の情報がなければ、これがあなたの問題の鍵になると思います。他のファイルで機能するように、この演算子を前方宣言する必要があります。

アルバムコレクションのヘッダーファイルで、次のように宣言の後に前方宣言を含めます(ヘッダーでディレクティブAlbumCollectionを使用していないと思います。使用している場合は、使用しないでください)。using

std::istream& operator>>(std::istream& is, AlbumCollection& albums);

#include <iostream>これを正しくコンパイルするには、ヘッダーに含める必要がある場合があります。ただし、インクルードする場所AlbumCollection.h(または対応するヘッダーが呼び出される場所)では、このオーバーロードを使用できます。プログラムをリンクすると、前に定義した定義が使用されます。さらに、これが機能するためにはinline、定義から修飾子を削除する必要がある可能性があります。

これが問題である場合、エラー出力は恐らく恐ろしいものであったことに注意してください。この問題が発生した場合、コンパイラエラー出力の多くがなくなり、既存のコードコンパイルの問題をデバッグするのがはるかに簡単になります。

于 2012-12-09T19:37:38.757 に答える