【发布时间】:2013-05-28 14:02:04
【问题描述】:
标题不代表我的问题,但我找不到正确的,请随时编辑。
上下文:
学校的炸弹人项目。
在我的Bomberman 中,我有一个execAfter() 函数原型如下:
void execAfter(std::function<void(t_params *)> func, t_params *params, int ms);
这个函数的目的是在ms延迟之后执行func,以params结构作为参数。
示例:投下炸弹,X 毫秒后爆炸。
它完美地工作(使用 lambda,正如在上一个 SO 问题中所说的 here)。
问题
现在我想对我的函数进行模板化,以便能够传递不同的函数类型和不同的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
我真的不明白,请解释一下这个模板化函数无法生成的可能原因。
如果您需要更多信息,请告诉我。
【问题讨论】:
-
你的功能的实现也包括在内?
-
@很快你想要 execAfter() 函数的代码?
-
没有。我在谈论它:Why can templates only be implemented in the header file。你知道吗?
-
是的。应包括模板的实施。请再次阅读上面发布的链接。
-
没问题。很高兴它有帮助:)
标签: c++ templates gcc c++11 compilation