2

我正在尝试显式实例化一个函数模板。请看代码片段

主.cpp:

void func(int * );

int main()
{
    int m = 3, n = 5;

    int *ptr;

    ptr = &m;

    func(ptr); //function call

    <do-Something>
    .....
    .....

}

func() 函数在这个 cpp 文件中

函数.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 文件中

定义.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> &);

但仍然收到链接错误

对 void sum<1, 2, 3>(int*, myclass<1, 2, 3>&) 的未定义引用

我在这里做错了什么?

4

1 回答 1

0

你说它define.hpp不包含在任何编译单元中。嗯,那是你的问题。因为现在模板的定义和显式实例化都不存在于任何编译单元中,因此永远不会被编译。

将文件从标头更改为源文件并将其添加到编译中应该可以修复它。

除此之外,实例化中存在语法错误。正如Jarod42template void sum<1, 2, 3>(int *, myclass<1, 2, 3> &);所指出的那样。

于 2015-06-08T07:33:51.053 回答