可能重复:
Why can templates only be implemented in the header file?
我在编译返回模板类型向量的函数时遇到问题。如果我删除模板并替换为double
,则代码会编译。此外,仅当函数定义和原型不在同一文件中时,才会出现此问题。我使用编译:
g++ func.cpp main.cpp
main.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;
}
func.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;
}
func.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
答案 0 :(得分:2)
不应将模板类拆分为.hpp
和.cpp
个文件。
成员函数实现也必须包含在编译单元中(例如,您的main.cpp
),否则编译器无法知道如何使用您提供的类型作为模板参数来构建模板类。您可能 #include "func.cpp"
main.cpp
,但这很难看。
正如大卫建议的那样,如果你感到好奇,https://stackoverflow.com/a/3040706/713961会为你提供更多信息。
答案 1 :(得分:0)
必须在同一文件中定义模板,否则会出现链接器错误。有关详细信息,请参阅this answer。