2

可能重复:
为什么模板只能在头文件中实现?

我在编译返回模板类型向量的函数时遇到问题。如果我删除模板并替换为double. 此外,仅当函数定义和原型不在同一个文件中时,才会出现此问题。我编译使用:

g++ func.cpp main.cpp

主.cpp:

#include <vector>
#include "func.h"

int main(int argc, char** argv)
{
    double x_min = 0.0;
    double x_max = 1.0;
    int N = 20;
    std::vector<double> x = linspace(x_min,x_max,N);

    return 0;
}

函数.cpp:

#include "func.h"

template <class T>
std::vector<T> linspace(T x1, T x2, int N)
{
    std::vector<T> x(N);
    if(N == 1)
    {
        x[0] = x2;
        return x;
    }

    T delta_x = (x2-x1)/(N-1);

    for(int ii = 0; ii < N; ii++)
    {
        x[ii] = x1 + ii*delta_x;
    }

    x[N-1] = x2;
    return x;
}

函数.h:

#include <vector>

template <class T>
std::vector<T> linspace(T x1, T x2, int N);

编译器产生以下输出:

/tmp/cclptwq7.o: In function `main':
main.cpp:(.text+0x45): undefined reference to `std::vector<double, std::allocator<double> > linspace<double>(double, double, int)'
collect2: ld returned 1 exit status
4

2 回答 2

2

模板类不应拆分为.hpp文件.cpp

成员函数实现也必须包含在编译单元(例如,您的main.cpp)中,否则编译器无法知道如何使用您作为模板参数提供的类型构建模板类。你可以#include "func.cpp"in main.cpp,但这会很丑陋。

正如大卫建议的那样,如果您好奇, https://stackoverflow.com/a/3040706/713961会为您提供更多信息。

于 2013-01-28T17:16:15.627 回答
0

模板必须在同一个文件中定义,否则会出现链接器错误。有关更多信息,请参阅此答案

于 2013-01-28T17:16:47.780 回答