0

単純なリンクリストを実装していますが、LNK2019エラーが発生し続け、問題を追跡するためにコードを最小限に簡略化しましたが、引き続き発生します。VisualStudio2010を使用しています。ヘッダーファイルは次のとおりです。

#ifndef __TSLinkedList__H__
#define __TSLinkedList__H__

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "LinkedNode.h"

template <class T>
class LinkedList
{
public:
LinkedList(void);
~LinkedList(void);
protected:
LinkedNode<T> * head;
};

実装ファイルは次のとおりです。

#include "StdAfx.h"
#include "LinkedList.h"

template <class T>
LinkedList<T>::LinkedList(void)
{
head = NULL;
}
template <class T>
LinkedList<T>::~LinkedList(void)
{
}

主な機能は次のとおりです。

#include "stdafx.h"
#include "stdlib.h"
#include "LinkedList.h"

int _tmain(int argc, _TCHAR* argv[])
{
LinkedList<int> mList;
system("PAUSE");
return 0;
} 

そして私はこのエラーを受け取っています:

エラー1エラーLNK2019:símboloexterno "public:__thiscall LinkedList ::〜LinkedList(void)"(?? 1?$ LinkedList @ H @@ QAE @ XZ)in function _wmain

コンストラクターでも同じエラーが発生します。面白いのは、それが_wmainを指していることで、私のメイン関数は_tmainと呼ばれています。サブシステムリンカーを/SUBSYSTEM:WINODWSから/ SUBSYSTEM:CONSOLEに変更しようとしましたが、すでに/ SUBSYSTEM:CONSOLEとして設定されています。明らかに、私の実装はこれ以上のことを行いますが、この問題を追跡するためにすべてを取り除いた。wpuldが高く評価されるのを手伝ってください、これは私を狂わせています。私はC++を初めて使用します。

4

2 に答える 2

2

関数の実装をヘッダーファイルに移動します。

特殊化用のコードを生成するには、コンパイラーは各変換単位で使用可能な関数の定義を持っている必要があります。

#ifndef __TSLinkedList__H__
#define __TSLinkedList__H__

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "LinkedNode.h"
template <class T>
class LinkedList
{
public:
    LinkedList(void);
    ~LinkedList(void);
    protected:
    LinkedNode<T> * head;
};

template <class T>
LinkedList<T>::LinkedList(void)
{
head = NULL;
}
template <class T>
LinkedList<T>::~LinkedList(void)
{
}

#endif
于 2012-07-12T14:51:57.903 に答える
0

テンプレート クラス メンバーの定義はコンパイル単位に含まれていないため、コンパイラはそれらをコンパイルしません。

ただし、一部のメンバーが使用されていることわかるため、これらに対して「未定義」のシンボルが生成されます。

次にリンカが来て、未定義のシンボルを、コンパイルされたオブジェクト ファイルの 1 つで定義されたいくつかのシンボルに一致させようとします。

しかし、LinkedList::~LinkedLis()デストラクタはコンパイルされていないため、どのオブジェクト ファイルにも含まれておらず、リンカはそれについて不平を言っています。

これを修正するには、

  • メインソースファイルに定義ファイルを含め、
  • または、テンプレート ヘッダー ファイル内に定義を貼り付けます。
  • または、テンプレートヘッダーファイルの下部からテンプレート実装ファイルを含めます(私のお気に入り)
于 2012-07-12T15:02:33.073 に答える