4

OK、私はC ++を初めて使用するので、エラーメッセージからどのような情報を取得できるかを理解しようとしています.

ここにエラーメッセージがあります

アーキテクチャ x86_64 の未定義のシンボル:
  "PieceClothing::PieceClothing(int)"、次から参照:
      ClothingInventory::getPieceOfClothing(long) in ClothingInventory.o
      ClothingInventory::insertIntocloset(std::basic_string, std::allocator >)inClothesInventory.o
  "PieceClothing::PieceClothing()"、以下から参照:
      ClothingInventory::ClothesInventory()inClothesInventory.o
      ClothingInventory::ClothesInventory(std::basic_string, std::allocator >)ClothesInventory.o 内
      std::map, std::allocator > >::operator[](long const&) in ClothingInventory.o
ld: アーキテクチャ x86_64 のシンボルが見つかりません
collect2: ld が 1 つの終了ステータスを返しました

これが私が理解していることです:
- 2 つのエラーがあります。
- getPieceOfClothing と insertIntocloset に関係するもの。
-コンストラクターの他のものは、私がそこに持っているマップやイテレーターについてかもしれません。

明確にするために、質問のポイントはメッセージから取得できるすべての情報を理解することであるため、コードを添付しません。

助けてくれてありがとう。

4

2 に答える 2

5

エラーは実際にはコンストラクターに関するものです。

PieceClothing::PieceClothing(int)
PieceClothing::PieceClothing()

そして彼らは、それらのシンボルが見つからなかったと言っています. これは通常、次のいずれかの兆候です。

  • それらは実装されていませんでした
  • それらは実装されていますが、実装があるファイルはコンパイルされていません
  • それらを定義するモジュールとリンクしていない別のモジュールからそれらを参照しています

エラーリストのその他の詳細は、コンストラクターが呼び出された場所を示しているだけです。たとえば、次の場合:

ClothesInventory::getPieceOfClothing(long)
{
   PieceClothing p;
}

そのタイプのオブジェクトを作成しようとするため、コンストラクターを参照しています。

これがどのように機能するかは、次の 2 つの部分に分けることができます。

1) コンパイラは、クラスを定義するヘッダー ファイルをチェックし、既定のコンストラクターが使用可能かどうかを確認します。コンストラクターが見つかるので、OKになります。

2) リンカが動作します。オブジェクト ファイルと参照ライブラリ内の呼び出しに一致するシンボルを探します。これはあなたにとって間違っているところです。

于 2012-04-27T10:59:02.530 に答える
0

メッセージは、宣言されたコンストラクターの定義が見つからないことを示しているため、コンストラクターPieceClothing::PieceClothing(int)PieceClothing::PieceClothing()記述したかどうか、記述した場合は、それらを含むオブジェクトファイルがリンクの一部を形成しているかどうかを確認する必要があります。

リンカの出力が冗長な場合は、リンクされているオブジェクトファイルが表示されます。

于 2012-04-27T11:18:29.343 に答える