0

私はC++で多少新しいです(私は通常C#で作業しますが、今は多少クロスプラットフォームのプロジェクトに取り組んでいます)すべてのコンセプトに正確には慣れていません。だから当然、私はなぜこのエラーが出ているのかよく分かりません。私は、エラーを少し調べてみました。そして、ライブラリファイルをリンクしたり、ヘッダファイル内の関数を宣言したり、それを決して定義しないと、一般的に人々が抱える問題のようです。私のエラーは、奇妙なことにも、どちらの結果でもありません。私がファイルの実装を作ったことがないということを教えしようとしているようにそれはそう、私にMSVCリンカーエラーLNK2001はcppファイルに定義されているテンプレートメソッドの未解決の外部メソッドです

Error 1 error LNK2001: unresolved external symbol "public: __thiscall ld22::QuadNode<class ld22::DrawableObject>::QuadNode<class ld22::DrawableObject>(class sf::Rect<float>)" ([email protected]@[email protected]@@[email protected]@[email protected][email protected]@[email protected]@@Z) C:\Users\Nick\Documents\Visual Studio 2010\Projects\GDCSFMLTest\GDCSFMLTest\main.obj

:正確なエラーテキストは、このです。しかし、私は持っています。 main.cpp、MAIN.OBJにコンパイルし、エラーを与えファイルは、行QuadNode(sf::FloatRect);と(技術的には、コンストラクタ)関数を宣言Quadtree.hを含み、ファイルQuadtree.cppでIはQuadtree.hを含み、次のようにコンストラクタを定義:

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

私が言ったように、悪いコーディング慣行などは許せません。私はC++をかなり新しくしています。私はまだ物事を理解しようとしています。どんな助けもありがたいです(特に私がやったと感じる愚かなや初心者のエラーの場合は特に)、さらに情報が必要なら私はそれを提供して嬉しいです。

答えて

3

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

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

+0

MSVCは、テンプレート関数は、ヘッダファイルの外部に実装することができますが、これは、DLLの境界を越えて動作しません。 – x4u

+0

ありがとうございます!私はそれが初心者であるか、または十分に読んでいないという何らかの愚かな間違いであることを知っていました。私はC++の概念である "ヘッダ内で宣言し、別のファイルで定義する"全体に慣れすぎて、すべてのケースで同じであったと仮定しています。 StackOverflowがこれを私の答えとして受け入れるとすぐに私はそれを行います。 – Pokelover980

関連する問題