C++ 在.cpp文件之外使用模板函数,而不在.hh文件中声明它
标题不能代表我的问题,但我找不到正确的标题,请随意编辑 背景: 学校的轰炸机项目 在我的C++ 在.cpp文件之外使用模板函数,而不在.hh文件中声明它,c++,templates,gcc,c++11,compilation,C++,Templates,Gcc,C++11,Compilation,标题不能代表我的问题,但我找不到正确的标题,请随意编辑 背景: 学校的轰炸机项目 在我的Bomberman中,我有一个execAfter()函数原型如下: void execAfter(std::function<void(t_params *)> func, t_params *params, int ms); Time.cpp template<typename T, typename U, typename V> void Time::execAfter(T fu
Bomberman
中,我有一个execAfter()
函数原型如下:
void execAfter(std::function<void(t_params *)> func, t_params *params, int ms);
Time.cpp
template<typename T, typename U, typename V>
void Time::execAfter(T func, U params, V ms)
{
...
}
我真的不明白,请解释一下这个模板函数不能生成的可能原因
请告诉我,如果你需要更多信息,C++中的 模板被理解为编译器生成代码的模板。因此,编译器必须在模板的每次实例化时知道实现是什么,即它应该位于模板定义的头文件中 您可以使用以下模板的具体实现:
template <typename T>
T f(T) { ...}
template<>
int f<int>(int) {...}
模板
tf(T){…}
模板
int f(int){…}
然后链接器将找到一个具体类型的实现,并将优先使用它而不是编译器生成的版本
您现在拥有的是一个没有实现的模板声明,这意味着链接器将只搜索具体的实现,而没有找到一个
有两种可能的解决方案:
在C++中,模板被理解为编译器生成代码的模板。因此,编译器必须在模板的每次实例化时知道实现是什么,即它应该位于模板定义的头文件中 您可以使用以下模板的具体实现:
template <typename T>
T f(T) { ...}
template<>
int f<int>(int) {...}
模板
tf(T){…}
模板
int f(int){…}
然后链接器将找到一个具体类型的实现,并将优先使用它而不是编译器生成的版本
您现在拥有的是一个没有实现的模板声明,这意味着链接器将只搜索具体的实现,而没有找到一个
有两种可能的解决方案:
函数的实现也包括在内?@很快你想要execAfter()函数的代码吗?不,我说的是:。你知道吗?知道。应包括模板的实现。请再次阅读上面的链接。没有问题。很高兴它有帮助:)并且也包含了函数的实现?@很快您想要execAfter()函数的代码吗?不,我说的是:。你知道吗?知道。应包括模板的实现。请再次阅读上面的链接。没有问题。很高兴它有帮助:)我用同样的方法完成了其他模板函数,它们工作得很好,你认为这可能是个例外吗?也许你只在cpp文件中使用了其他模板函数,它们在定义的地方,在定义的下面?嗯,有意思,我检查了一下,很快就会回来。好的,这就是问题所在。只有在同一个.cpp文件中使用它时,才能使用我的方式。非常感谢。我已经用同样的方法完成了其他模板函数,它们工作得非常好,你认为这可能是一个例外吗?也许你只在cpp文件中使用了其他模板函数,它们在定义的地方,在定义的下面?嗯,有意思,我检查了一下,很快就会回来。好的,这就是问题所在。只有在同一个.cpp文件中使用它时,才能使用我的方式。谢谢。
template <typename T>
T f(T) { ...}
template<>
int f<int>(int) {...}