Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在.cpp文件之外使用模板函数,而不在.hh文件中声明它_C++_Templates_Gcc_C++11_Compilation - Fatal编程技术网

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) {...}