以整数作为模板参数的函数模板的显式实例化
explicit instantiation of a function template having integers as template parameters
我正在尝试显式实例化函数模板。请看代码片段
main.cpp:
void func(int * );
int main()
{
int m = 3, n = 5;
int *ptr;
ptr = &m;
func(ptr); //function call
<do-Something>
.....
.....
}
func() 函数在此 cpp 文件中
func.cpp :
#include "class_def.h"
template <int x1, int x2, int x3>
void sum(int *, myclass<x1, x2, x3> &); //template declaration
void func(int *in)
{
myclass<1,2,3> var;
sum(in,var); //call to function template
<do-Something>
.....
.....
}
class_def.h :
template<int y1, int y2, int y3>
class myclass
{
public:
int k1, k2, k3;
myclass()
{
k1 = y1;
k2 = y2;
k3 = y3;
}
};
函数模板的定义"sum"驻留在另一个hpp文件中
define.hpp :
#include "class_def.h"
template <int x1, int x2, int x3>
void sum(int *m, myclass<x1, x2, x3> & n) //function template definition
{
<do-Something>
.....
.....
}
现在,为了实例化此模板,我在定义下方编写了以下代码语句。
template void sum<int, int, int>(int *, myclass<1, 2, 3> &);
但仍然收到链接错误
undefined reference to void sum<1, 2, 3>(int*, myclass<1, 2, 3>&)
我做错了什么?
你说define.hpp
不包含在任何编译单元中。嗯,那是你的问题。因为现在模板的定义和显式实例化都不存在于任何编译单元中,因此永远不会被编译。
将文件从头文件更改为源文件并将其添加到编译中应该可以修复它。
除此之外,实例化中还有语法错误。正如 Jarod42 所指出的,它应该是 template void sum<1, 2, 3>(int *, myclass<1, 2, 3> &);
。
我正在尝试显式实例化函数模板。请看代码片段
main.cpp:
void func(int * );
int main()
{
int m = 3, n = 5;
int *ptr;
ptr = &m;
func(ptr); //function call
<do-Something>
.....
.....
}
func() 函数在此 cpp 文件中
func.cpp :
#include "class_def.h"
template <int x1, int x2, int x3>
void sum(int *, myclass<x1, x2, x3> &); //template declaration
void func(int *in)
{
myclass<1,2,3> var;
sum(in,var); //call to function template
<do-Something>
.....
.....
}
class_def.h :
template<int y1, int y2, int y3>
class myclass
{
public:
int k1, k2, k3;
myclass()
{
k1 = y1;
k2 = y2;
k3 = y3;
}
};
函数模板的定义"sum"驻留在另一个hpp文件中
define.hpp :
#include "class_def.h"
template <int x1, int x2, int x3>
void sum(int *m, myclass<x1, x2, x3> & n) //function template definition
{
<do-Something>
.....
.....
}
现在,为了实例化此模板,我在定义下方编写了以下代码语句。
template void sum<int, int, int>(int *, myclass<1, 2, 3> &);
但仍然收到链接错误
undefined reference to void sum<1, 2, 3>(int*, myclass<1, 2, 3>&)
我做错了什么?
你说define.hpp
不包含在任何编译单元中。嗯,那是你的问题。因为现在模板的定义和显式实例化都不存在于任何编译单元中,因此永远不会被编译。
将文件从头文件更改为源文件并将其添加到编译中应该可以修复它。
除此之外,实例化中还有语法错误。正如 Jarod42 所指出的,它应该是 template void sum<1, 2, 3>(int *, myclass<1, 2, 3> &);
。