3

マップ/辞書データ構造用のテンプレートクラスを作成しましたが、この奇妙なエラーが発生し続けます(ERROR LNK2019:unresolved external symbol)

コード:

AssArray.h:

#pragma once   
template <class K,class D>   
class AssArray   
{   
    int _size;   
    int _position;   
    D* _data;   
    K* _key;  

public:    
     AssArray(int);
    ~AssArray(void);

    const D& operator [](K k) const;
    D& operator [](K k);
};

AssArray.cpp:

#include "StdAfx.h"
#include "AssArray.h"

template <class K,class D>
AssArray<K,D>::AssArray(int size)
{
    _size=size;
    _data = new D[size];
    _key = new K[size];
    _position=0;
}

template <class K,class D>
AssArray<K,D>::~AssArray(void)
{
        delete[] _data;
    delete[] _key;
}

template <class K,class D>
const D& AssArray<K,D>::operator [](K k) const
{
    //Get
    for(int i=0;i<_position;i++)
        if(_key[i]==d)
            return _data[i];
    return NULL;
}

template <class K,class D>
D& AssArray<K,D>::operator [](K k)
{
    //Set
    for(int i=0;i<_position;i++)
        if(_key[i]==d)
            return _data[i];

    if(_position<_size-1)
    {
        _key[position]=d;
        _position++;
        return _data[_position];
    }
    else
    {
        //Implement error handling
    }

}

エラーは次のとおりです:
1

"Error  4   error LNK1120: 3 unresolved externals   
C:\Users\*****\Documents\Visual Studio 2010\Projects\OOPLAB4NYARE\Debug
\OOPLAB4NYARE.exe   1   1   OOPLAB4NYARE"

2

Error   1   error LNK2019: unresolved external symbol "public: __thiscall 
AssArray<char *,float>::~AssArray<char *,float>(void)" (??1?$AssArray@PADM@@QAE@XZ)
referenced in function _wmain   C:\Users\*****\Documents\Visual Studio
2010\Projects\OOPLAB4NYARE\OOPLAB4NYARE\OOPLAB4NYARE.obj    OOPLAB4NYARE

3

Error   3   error LNK2019: unresolved external symbol "public: __thiscall
AssArray<char *,float>::AssArray<char *,float>(int)" (??0?$AssArray@PADM@@QAE@H@Z) 
referenced in function _wmain   C:\Users\*****\Documents\Visual Studio 
2010\Projects\OOPLAB4NYARE\OOPLAB4NYARE\OOPLAB4NYARE.obj    OOPLAB4NYARE

4

Error   2   error LNK2019: unresolved external symbol "public: float & 
__thiscall AssArray<char *,float>::operator[](char *)" 
(??A?$AssArray@PADM@@QAEAAMPAD@Z) referenced in function _wmain C:\Users\Jonathan
\Documents\Visual Studio 2010\Projects\OOPLAB4NYARE\OOPLAB4NYARE\OOPLAB4NYARE.obj   
OOPLAB4NYARE

私はMicrosoftVisualStudio2010Ultimateを使用しています。それはおそらく私が今見落としていた簡単なことです。

クリーンアップ->再構築、新しいプロジェクトの作成、関連するコードのコピー貼り付け、および解決策の検索を試みましたが、私が見たものはかなり多様で曖昧です。

4

2 に答える 2

5

.cppクラステンプレートのメンバー関数定義をファイルに入れることはできません。

クラステンプレートのメンバー関数の定義は、それらの関数が呼び出された時点で、その呼び出しを含む変換ユニット(つまり.cppファイル)を処理しているときにコンパイラーが確認する必要があります。これにより、コンパイラは実際にコードを生成できます。これらの関数が呼び出されない限り、インスタンス化は発生しません。

.cppこれらの関数の呼び出しを含まないファイルに関数定義を配置することにより、基本的に次のようになります。

  1. .cpp他のファイルがそれらを見る機会がない場所にそれらを封印します。
  2. .cppそれらの定義を見ることができる唯一のファイルでそれらの関数のインスタンス化を回避します。

したがって、コンパイラはそれらのオブジェクトコードを生成せず、リンカは最終的に対応するシンボルが見つからないと文句を言います(これがエラーになります)。

この問題を解決するには、クラステンプレートのメンバー関数定義を、クラステンプレート定義が存在するのと同じヘッダー(このAssArray.h場合)、または#includeそれらの関数が呼び出される変換ユニットによってdされるヘッダーに移動します(および呼び出しポイントの前)。

于 2013-02-12T22:29:52.393 に答える
2

テンプレートクラスのメソッドは、クラスを定義するのと同じヘッダーに実装する必要があります(通常、インラインメソッドとして、クラス自体の内部に実装されます)。

于 2013-02-12T22:29:44.630 に答える