C++ C++;——模板类型的函数返回向量
可能重复:C++ C++;——模板类型的函数返回向量,c++,templates,vector,compilation,C++,Templates,Vector,Compilation,可能重复: 我在编译返回模板类型向量的函数时遇到问题。如果删除模板并替换为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;
我在编译返回模板类型向量的函数时遇到问题。如果删除模板并替换为
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.h”
int main(int argc,字符**argv)
{
双x_min=0.0;
双x_max=1.0;
int N=20;
std::vector x=linspace(x_min,x_max,N);
返回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”
模板
向量linspace(T x1,T x2,int N)
{
std::向量x(N);
如果(N==1)
{
x[0]=x2;
返回x;
}
Tδx=(x2-x1)/(N-1);
对于(int ii=0;ii
职能h:
#include <vector>
template <class T>
std::vector<T> linspace(T x1, T x2, int N);
#包括
模板
std::向量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
/tmp/cclptwq7.o:在函数'main'中:
main.cpp:(.text+0x45):对“std::vector linspace(double,double,int)”的未定义引用
collect2:ld返回了1个退出状态
模板类不应拆分为.hpp
和.cpp
文件
成员函数实现也必须包含在编译单元中(例如,您的main.cpp
),否则编译器无法知道如何使用您作为模板参数提供的类型构建模板类。您也可以在main.cpp
中包含“func.cpp”,但这会很难看
正如David所建议的,如果您感到好奇,可以提供更多信息。模板必须在同一文件中定义,否则会出现链接器错误。有关更多信息,请参阅。技术上不正确。他们可以,只要你做得恰当,并接受它所暗示的限制。通常情况下,人们不会这样做,因为这涉及到所有的权衡,但这是可以做到的。:)