首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++ 里面template 的有关问题

2013-07-01 
c++ 里面template 的问题#includeiostream#includemath.husing namespace stdtemplate class Tclas

c++ 里面template 的问题


#include<iostream>
#include<math.h>
using namespace std;

template <class T>
class Point
{
private:
int n;
T *a;
public:
friend T EuDistance(Point<T> &p1, Point<T> &p2);
Point(T p[], int s): n(s)
{
a=new T[n=s];
for(int i=0;i<n;i++)
{
a[i]=p[i];
}
}
~Point()
{
delete [] a;
}
};

template <class T>
T EuDistance(Point<T> &p1, Point<T> &p2)   // use class template should have template argument list
{
int i=0;
T dist=0;

for(i=0;i<p1.n;i++)
{
dist=dist+(p1.a[i]-p2.a[i])*(p1.a[i]-p2.a[i]);
}

return sqrt(dist);
}

int main()
{
double a1[3]={2,2,3};
double a2[3]={1,3,7};
//int a3[2]={4,3};
//int a4[2]={2,4};

Point<double> P1(a1,3);
Point<double> P2(a2,3);
//Point<int> P3(a3,2);
//Point<int> P4(a4,2);

    cout<<EuDistance(P1,P2)<<endl;;
//cout<<EuDistance(P3,P4)<<endl;

return 0;
}




在vc++里面编译错误,  error LNK2019: unresolved external symbol "double __cdecl EuDistance(class Point<double> &,class Point<double> &)" (?EuDistance@@YANAAV?$Point@N@@0@Z) referenced in function _main

但如果我不用template 的话,就可以正常编译运行,不太明白具体是template 哪里除了问题。请大神指教啊。
C++ 类
[解决办法]

#include<iostream>
#include<math.h>
using namespace std;

//要先声明模版。。
template <class T> class Point;
template <class T>
T EuDistance(Point<T> &p1, Point<T> &p2);

template <class T>
class Point
{
private:
int n;
T *a;
public:
friend T EuDistance<T>(Point<T> &p1, Point<T> &p2);
Point(T p[], int s): n(s)
{
a=new T[n=s];
for(int i=0;i<n;i++)
{
a[i]=p[i];
}
}
~Point()
{
delete [] a;
}
};

template <class T>
T EuDistance(Point<T> &p1, Point<T> &p2)   // use class template should have template argument list
{
int i=0;
T dist=0;

for(i=0;i<p1.n;i++)
{
dist=dist+(p1.a[i]-p2.a[i])*(p1.a[i]-p2.a[i]);
}

return sqrt(dist);
}

int main()
{
double a1[3]={2,2,3};
double a2[3]={1,3,7};
//int a3[2]={4,3};


//int a4[2]={2,4};

Point<double> P1(a1,3);
Point<double> P2(a2,3);
//Point<int> P3(a3,2);
//Point<int> P4(a4,2);

    cout<<EuDistance(P1,P2)<<endl;;
//cout<<EuDistance(P3,P4)<<endl;

return 0;
}


[解决办法]
引用:
上一条没弄好

friend T EuDistance<T>(Point<T> &p1, Point<T> &p2);


为什么在EuDistance 后面加<T>, 在class 里面声明友元的时候。

因为EuDistance本身是个模板函数。不声明是模板的话,没法进行特化。

热点排行