2

別のファイルのクラスからオブジェクトを宣言しようとしています。をファイルに追加しました#include "transfer.h"metadata.cpp、次のエラーが発生します。

 metadata.o: In function `importMetadata':
 metadata.cpp:(.text+0x81): undefined reference to A::B::C::Transfer::Transfer()'
metadata.cpp:(.text+0x81): undefined reference to A::B::C::Transfer::~Transfer()'

そして Transfer は in で定義されていますtransfer.h

namespace A{
  namespace B{
    namespace C{
       class Transfer {
            public:
               Transfer();
               ~Transfer();
               int copydata();
            ... more code goes here.
        };
    }
   }
}

ファイルtransfer.cppは次のようになります。

Transfer::Transfer(){
}
Transfer::~Transfer(){
}

using namespace A::B::C;また、metadata.cpp ファイルのヘッダーでも実行しています。誰かが私を助けてくれますか?の関数int importMetadata()metadata.cpp宣言しTransfer transfer;ているので、metadata.cpp「transfer.copydata();」を実行しています

4

2 に答える 2

2

リンカーエラーがあり、コンパイラエラーがないため、これは、#includeステートメントが目的の処理を実行しており、コンパイラがTransferクラスとそのコンストラクタを認識することを示しています。このエラーは、リンカがリンクするように指示された.oまたは.libファイルの1つでTransfer :: Transfer()関数の実装への参照を見つけようとしたが、見つからなかった場合に発生します。

transfer.hと一緒にtransfer.cppを使用している可能性があり、このファイルにはTransferコンストラクタとデストラクタの実装がありません。これは、関数が完全に欠落しているか、誤って別の署名で定義されていることが原因である可能性があります。

したがって、transfer.cppは次のようになります。

A::B::C::Transfer::Transfer()
{
}

A::B::C::Transfer::~Transfer() 
{
}

もう1つの可能性は、ライブラリからの転送の実装をリンクしようとしていることです。この場合、入力として.libファイルを使用するようにリンカーに指示する必要があります。この構文は、使用しているコンパイラによって異なります。

于 2012-06-16T01:24:14.147 に答える
1

transfer.cppファイルの一部を省略したことを願っていますが、省略した場合は、次のようにヘッダーファイルと一致するように名前空間を定義する必要があります。

namespace A{
  namespace B{
    namespace C{
        Transfer::Transfer(){
        }
        Transfer::~Transfer(){
        }
    }
  }
}

インラインまたは上記のように名前空間を完全に定義した場合は、プロジェクトにtransfer.cppファイルが含まれていることを確認する必要があります。リンカがソースファイルを見つけられないようです。

于 2012-06-16T02:44:19.080 に答える