-1

パブリックテンプレート関数を次のクラスで定義しましたEventDispatcher

public:
    template <class className> void AddEventListener ( className* );

関数は次のように実装されます。

template <class className>
void EventDispatcher::AddEventListener ( className* ptr )
{

};

Timer次に、あるクラスで、子であるインサテンスを作成し、次のEventDispatcherように呼び出しますAddEventListener

timer->AddEventListener ( this );

エラーが発生した後

/tmp/ccjRF7sK.o: In function `AirHockeyServer::AirHockeyServer()':
AirHockeyServer.cpp:(.text+0xa5): undefined reference to `void EventDispatcher::AddEventListener<AirHockeyServer>(AirHockeyServer*)'
/tmp/ccjRF7sK.o: In function `AirHockeyServer::AirHockeyServer()':
AirHockeyServer.cpp:(.text+0x187): undefined reference to `void EventDispatcher::AddEventListener<AirHockeyServer>(AirHockeyServer*)'
collect2: ld returned 1 exit status
4

6 に答える 6

4

関数を定義したと言いますが、宣言を示しただけです。定義も必要です。

template <class className> void AirHockeyServer::AddEventListener ( className* )
{
    // code goes here
}

質問が更新され、どこかに定義があることが示されました。

これはテンプレートであるため、関数を使用するすべてのソースファイルから含まれるヘッダーに含める必要があります。テンプレートは使用時にインスタンス化され、インスタンス化するには完全な定義が必要です。

同様に、クラス定義内で定義できます。

public:
    template <class className> void AddEventListener ( className* )
    {
        // code goes here
    }
于 2012-08-27T11:00:31.670 に答える
1

これは、リンカがAddEventListenerメンバー関数の実装を認識していないことを示すリンカエラーです。テンプレートでは、関数の実装をヘッダーファイルに入れるのが一般的であるため、任意のテンプレートパラメーター引数に対して関数をインスタンス化できます。

于 2012-08-27T10:58:36.833 に答える
1

リンカはの実装を見つけることができませんtemplate<class className> AddEventListener<className*>。テンプレートの場合、実装は宣言と同じファイルにある必要があります。

于 2012-08-27T11:00:36.650 に答える
1

テンプレートがある場合、クラスを個別のヘッダーファイルとソースファイルに実際に分割することはできません。ヘッダーファイルにも定義を入れる必要があります。

于 2012-08-27T11:02:24.340 に答える
1

テンプレート関数は、特定のタイプに対してインスタンス化する必要があります。実装を.cppファイルに入れてもそれはできません。

最も簡単な方法は、クラス定義自体に配置するか、ヘッダーファイルの直後に配置することです。

もう1つの方法は、それを.cppファイルに保持してから、必要なタイプに対して明示的なインスタンス化を行うことです。

template void EventDispatcher::AddEventListener(AirHockeyServer*);
于 2012-08-27T11:03:29.987 に答える
0

(この質問は「未定義の参照」テンプレートクラスコンストラクターの複製です)そしてそこにある答えは十分です。

要約すると、これを解決するには2つの方法があります。

  • template void EventDispatcher::AddEventListener(AirHockeyServer*);@LuboAntonovが言ったように、関数テンプレートの定義の後に置くことができます。
  • 他の多くの人が説明しているように、実装をヘッダーに移動します。

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

于 2012-08-27T11:40:19.447 に答える