0

タイトルは私の質問を代表するものではありませんが、正しいものが見つかりませんでした。自由に編集してください。

環境 :

学校向けボンバーマンプロジェクト。

Bombermanには、次のexecAfter()ようにプロトタイプ化された関数があります。

void execAfter(std::function<void(t_params *)> func, t_params *params, int ms);

この関数の目的は、遅延後に struct をパラメーターとしてfunc取り、を実行することです。paramsms

例:爆弾を投下し、X ミリ秒後に爆発します。

それは完全に機能します(以前のSOの質問でここで述べたようにラムダを使用します)。

問題

ここで、異なる関数タイプと異なるタイプを渡すことができるように、関数をテンプレート化したいと考えていますparams

時間.hh

template<typename T, typename U, typename V>
void execAfter(T func, U params, V ms);

時間.cpp

template<typename T, typename U, typename V>
void Time::execAfter(T func, U params, V ms)
{ 
 ...
}

(パラメーターのテンプレート化はV役に立ちませんが、コンパイルの問題のためだけでした。後で行う方法を見つけます)

例: *関数を呼び出し、void X(Y)パラメータとして渡しますY*

私の観点からは、リンケージgccがこれをスローした後を除いて、すべてがコンパイルされます。

[...]
 linkage ...
[...]
 src/Entities/Character.o: In function `Character::landBomb()':
 /home/teube_a/Code/tech2/c++/bomberman-2016-      couille_c/zizi_g/src/Entities/Character.cpp:208: undefined reference to `void   Time::execAfter<std::function<void (s_params*)>, s_params*, int>(std::function<void  (s_params*)>, s_params*, int)'
 collect2: ld returned 1 exit status
 make: *** [bomberman] Error 1

よくわかりません。このテンプレート化された関数を生成できない理由を教えてください。

さらに情報が必要な場合は教えてください。

4

1 に答える 1