1

私は C++ の初心者なので (通常は C# で作業していますが、現在は多少クロスプラットフォームのプロジェクトに取り組んでいます)、そのすべての概念と、コンパイル/リンクの正確な仕組みにあまり慣れていません。したがって、当然、このエラーが発生する理由はよくわかりません。私はエラーを少し調べましたが、ライブラリをリンクしたり、ヘッダーファイルで関数を宣言したりせず、その外部で定義しない場合によく発生する問題のようです。奇妙なことに、私のエラーはどちらの結果でもありません。正確なエラー テキストは次のとおりです。

" Error 1 error LNK2001: unresolved external symbol "public: __thiscall ld22::QuadNode<class ld22::DrawableObject>::QuadNode<class ld22::DrawableObject>(class sf::Rect<float>)" (??0?$QuadNode@VDrawableObject@ld22@@@ld22@@QAE@V?$Rect@M@sf@@@Z) C:\Users\Nick\Documents\Visual Studio 2010\Projects\GDCSFMLTest\GDCSFMLTest\main.obj"

私には、ファイルの実装を作成したことがないことを伝えようとしているようです。しかし、私は持っています。main.cpp、main.objにコンパイルされてエラーが発生するファイルにはQuadtree.h、行で関数(技術的にはコンストラクター)を宣言する が含まQuadNode(sf::FloatRect);れています。ファイルQuadtree.cppには、次のようにコンストラクターを含めQuadtree.hて定義します。

template<class T>
ld22::QuadNode<T>::QuadNode(sf::FloatRect bounds)
{
    Bounds = bounds;
}

私が言ったように、私はC ++にかなり慣れていないので、まだ物事を理解しようとしています. どんな助けでも大歓迎です (特に、私がどこかで愚かな、または初心者のエラーを犯した場合、それは私がしたように感じます)。さらに情報が必要な場合は、喜んで提供します。

4

1 に答える 1

3

C++ では、テンプレート化されたクラスはヘッダー ファイルで定義する必要があります。これは、実行時に型を追跡する C# のジェネリックとは異なり、使用する<T>たびにコンパイラによって新しいクラスが実際に生成されるため<T>です。コンパイラには、テンプレート化された形式のクラスを実際にコンパイルしてから、型情報をリンクする方法がありません。私の見方では、C++ のテンプレートは実際には、コンパイル段階の前に行われるソース コード変換の形式です。

理由の詳細については、この質問を参照してください。

于 2012-01-21T04:59:51.720 に答える